【C语言】位运算
我们在上学计算机的第一节课,就应该见过这些常见的运算符。然而,你可能有印象,但记不住众多操作符当中的位运算符,以及它们的作用和使用场景,我们的大脑会选择性地遗忘它认为没用的信息,存储下那些“有实际应用场景”的有效知识。平时写代码的时候,只会和十进制打交道,这是因为在计算机的底层会帮我们把10进制运算的问题转化为二进制运算,计算机已经帮我们封装了位运算的逻辑。那么,我们为什么还要了解位运算呢?
在实际开发中,位图(Bitmap)是一种常用的数据结构和技术。通过高效的存储和操作方式,提供了快速且节省内存的解决方案。
例如,检测一批开发板是否合格,其中一个对象中存在某个属性:object:{ standard:true; } 这个对象中还有其他属性,但检测是否合格只需要判断 standard == 1;那么,假设用bit位来表示合格与不合格,1表示是,0表示非。
那么1个bit位 :10010000 第一个和第四个合格,其他的不合格,由此,我们不需要使用object的方式进行存储,我们可能将原本占用了32个字节大小的存储空间的对象压缩成了一个比特,8个比特可以检测8个开发板的合格与否。
一个字节是8个比特,所以存储空间被优化了256倍,假如有1000w块开发板需要检测并返回结果,用对象的方式存储需要占用的内存空间是300GB的内存空间大小,如果我们换成用bit的方式实现检测,只需要占用2GB的存储空间大小便能够完成检测。
使用这种一串比特位存储0和1两种状态的数据结构称为位图(BITMAP),
由此,我们知道了位图具有很多好处:
节省内存:位图能节省巨量的存储空间。内存效率高:使用位来表示信息,节省存储空间。例如,一个字节可以表示8个布尔值。对比数组 + 对象的方式不仅性能高出一个数量级而且极大节约了内存空间。快速访问:通过位运算可以快速地检查、设置或清除特定位的值。例如,查询第一个位置是否为 真:x & (1<<n);即使是某些批量操作和复杂操作,也只需要一次就能完成。便捷方便。资源管理、高效存储:用于管理有限资源的使用情况,如内存页的分配。状态标记:在控制多个布尔状态时(如任务调度),使用位图可以高效地管理和检查状态。图形显示:在简单图形系统中,用位图表示图像的像素状态。权限控制:利用位图表示用户或进程的权限集合。
移位运算符:专门写软件的人而言不重要,但对于嵌入式开发来说,这很重要 —> 因为在寄存器开发中会经常遇到。
<< >>
格式:表达式 << n
例子:移位运算--->针对位:bit位 --->二进制有关 int a=10;a<<3;
右移:要注意 符号位 算术右移: 空出来的位 补符号位 >考虑符号位逻辑右移: 空出来的位 补0 --->单纯的数值运算位运算: -->所有的运算都针对 二进制bit位 1>位与:& 解释: 表达式1 & 表达式2 ==>双方转化为二进制,按位对比,相同位上都为1,结果为1 例如: short a=520;short b=250;a&b--->a:0000 0010 0000 1000b:0000 0000 1111 1010 & ------------------------------>0000 0000 0000 1000 ==> 82>位或:|解释: 表达式1 | 表达式2 ==>相同位上数据如果有1,结果为1例如:short a=520;short b=250;a|b--->a:0000 0010 0000 1000b:0000 0000 1111 1010 |------------------------------------- 0000 0010 1111 1010 ==>7623>异或:^ 解释:表达式1 ^ 表达式2 ==>相同位上数据不相同,结果为1 例如:short a=520;short b=250;a^b--->a:0000 0010 0000 1000b:0000 0000 1111 1010 ^ -------------------------------0000 0010 1111 0010 ==> 754 4>取反:~ 解释: ~表达式1 ===> 0变1 1变0 例如: short a=520;a:0000 0010 0000 1000~a;1111 1101 1111 0111 --->有问题:补码1111 1101 1111 0110 --->反码 1000 0010 0000 1001 --->原码 = -521组合模仿:C语言原装是没有同或 :可以通过 取反 + 异或 得到同或 ~(a^b): --->达到同或
在嵌入式系统中,因为寄存器内存是有限的,对于内存空间的使用更为苛刻,位运算具有性能优势:
1、速度:位运算是基本的CPU操作,直接作用于数据的二进制表示,计算速度极快,比许多其他操作(如乘法、除法)更高效。
2、内存效率:通过位操作,可以在一个字节中存储多个布尔值,节省内存空间。
3、直接硬件控制:位运算能够直接操作硬件寄存器,方便设置或读取特定位,减少指令开销。
4、代码简洁、精确控制:使用位掩码进行状态管理和权限控制,使代码更简洁明了。提供对数据的精确控制,适合底层开发。
5、功耗降低:由于减少了处理器的运算时间和内存访问,能有效降低功耗,这是嵌入式系统中一个重要的考量。
位运算在资源有限、需要高效运行的嵌入式系统中有显著的性能优势,并节省了大量的内存空间。
位运算在控制硬件设备、检查传感器状态、高效传输和存储等多个场景中都十分必要,所以要熟悉位运算的方式。正如在编程之前,首先对每个过程中的逻辑环节都必须十分清晰,不可模糊编程。也可在这个过程中锤炼自己的编程思维,对业务流程也会更加清晰。
以上。
我是一个十分热爱技术的程序员,希望这篇文章能够对您有帮助,也希望认识更多热爱程序开发的小伙伴。
感谢!