热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【C/C++教学】来聊聊关于C中的位运算

前言许多童鞋对C语言编程掌握得不错,可以编出一些不俗的程序。但是对于C语言中提供的位运算却知之甚少,很少甚至不会灵活的运用。其实位运算是C语言的精髓之一,巧妙的利用位运算有时能大大

前言

许多童鞋对C语言编程掌握得不错,可以编出一些不俗的程序。但是对于C语言中提供的位运算却知之甚少,很少甚至不会灵活的运用。其实位运算是C语言的精髓之一,巧妙的利用位运算有时能大大的减少机器负担,提高程序的运行效率。

下面让我通过一个题目带领大家一起探究一下C中的位运算。一起来搞搞事情吧!


watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

题如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

首先对题目作简单说明,这里的循环移位的意思是将右移出的位补到最左边,例如:

对1:

0000 0000 0000 0001


右移1位变成:

1000 0000 0000 0000


现在要解决这个问题,首先我们需要先进行一些准备,同时也是一个预热:写一个输出数据的二进制码的方法,如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

其中sum是传入要被输出处理的数,z是其所占字节数

可以看到取位值的技巧就是移相应位后与1取&,其他在此不作过多说明。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

接下来进入正题了,输入获取值的不作讲解,直接代码伺候:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

值得注意的是:

sum为储存目标变换数的变量,c_sum为移位数,z用来存储该环境下整型所占字节数。


再接下来就是循环移位的关键:怎么个移法,怎么个解决方案?

如下图单纯移位运算行不行呢?

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

我们不妨运行测试一下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

然而,问题就出在了移位后第一位的1上

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

那么如何解决,不妨用个判断语句去其首位的1,上图:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

运行结果如下:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

可以看出程序已经正确运行了!

接下来我们再详细聊聊程序中。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

If语句用以判断数据的第一位是否是1,而如果是1的话,接下来的处理就是关键了,如果处理不好会导致前面全部补1甚至彻底乱码。

有很多种处理方法,正所谓条条大路通罗马。这里我只给出我的方法的解释。


①先将sum右移1位,第一位会自动补1,备用;


②再将1左移到第一位,后面会全部补0,接下来取反,也就变成了0后面一堆1;


③将上一步中得的补码与1中得的补码&,1中补码的第1位也就被替换成了0;


④最后取sum的最后1位右移到第一位与3中所得补码进行|或^运算。


修修补补的工作就不过多赘述。值得注意的是程序完成后能直接AC掉这道题,可以将测试方法bin()注释或直接删掉,这是一种非常好的编程技巧,可以大大降低程序维护的难度,提高编程效率和代码可读性!

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

END




推荐阅读
  • 本文深入探讨了 Python 中的循环结构(包括 for 循环和 while 循环)、函数定义与调用,以及面向对象编程的基础概念。通过详细解释和代码示例,帮助读者更好地理解和应用这些核心编程元素。 ... [详细]
  • 本文介绍了几种不同的编程方法来计算从1到n的自然数之和,包括循环、递归、面向对象以及模板元编程等技术。每种方法都有其特点和适用场景。 ... [详细]
  • C语言基础入门:7个经典小程序助你快速掌握编程技巧
    本文精选了7个经典的C语言小程序,旨在帮助初学者快速掌握编程基础。通过这些程序的实践,你将更深入地理解C语言的核心概念和语法结构。 ... [详细]
  • 本文探讨了《魔兽世界》中红蓝两方阵营在备战阶段的策略与实现方法,通过代码展示了双方如何根据资源和兵种特性进行战士生产。 ... [详细]
  • 单片机与PLC:入门难易度及应用场景对比
    本文探讨了单片机和PLC的学习难度及各自的应用场景,帮助读者根据自身需求选择合适的学习路径。单片机是一种微控制器,而PLC(可编程逻辑控制器)则专为工业自动化设计。两者各有优劣,适合不同的应用领域。 ... [详细]
  • 本文将深入探讨PHP编程语言的基本概念,并解释PHP概念股的含义。通过详细解析,帮助读者理解PHP在Web开发和股票市场中的重要性。 ... [详细]
  • PHP数组平均值计算方法详解
    本文详细介绍了如何在PHP中计算数组的平均值,涵盖基本概念、具体实现步骤及示例代码。通过本篇文章,您将掌握使用PHP函数array_sum()和count()来求解数组元素的平均值。 ... [详细]
  • Python入门:第一天准备与安装
    本文详细介绍了Python编程语言的基础知识和安装步骤,帮助初学者快速上手。涵盖Python的特点、应用场景以及Windows环境下Python和PyCharm的安装方法。 ... [详细]
  • 本文详细介绍了Python中列表的创建、访问、修改、排序及遍历等基本操作,帮助初学者快速掌握列表这一重要数据结构。 ... [详细]
  • 基于结构相似性的HOPC算法:多模态遥感影像配准方法及Matlab实现
    本文介绍了一种基于结构相似性的多模态遥感影像配准方法——HOPC算法,该算法通过相位一致性模型构建几何结构特征描述符,能够有效应对多模态影像间的非线性辐射差异。文章详细阐述了HOPC算法的原理、实验结果及其在多种遥感影像中的应用,并提供了相应的Matlab代码。 ... [详细]
  • 本文介绍如何配置SecureCRT以正确显示Linux终端的颜色,并解决中文显示问题。通过简单的步骤设置,可以显著提升使用体验。 ... [详细]
  • 俗话说得好,“工欲善其事,必先利其器”。这句话不仅强调了工具的重要性,也提醒我们在任何项目开始前,准备合适的工具至关重要。本文将介绍几款C语言编程中常用的工具,帮助初学者更好地选择适合自己学习和工作的编程环境。 ... [详细]
  • 深入解析Spring Boot自动配置机制
    本文旨在深入探讨Spring Boot的自动配置机制,特别是如何利用配置文件进行有效的设置。通过实例分析,如Http编码自动配置,我们将揭示配置项的具体作用及其背后的实现逻辑。 ... [详细]
  • 如何处理MySQL命令行中文乱码问题
    本文详细探讨了MySQL命令行中出现中文乱码的原因及解决方案,通过调整配置文件和执行特定SQL命令来确保字符集正确设置,为用户提供了一个有效的解决路径。 ... [详细]
  • HTML网页出现乱码的主要成因及解决策略
    本文深入分析了HTML网页出现乱码的各种可能原因,并提供了相应的解决方案,帮助开发者有效避免和处理此类问题。 ... [详细]
author-avatar
育霖培伦861
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有