C语言位运算符 & | ~ ^ << >>
所谓的位运算: 一位一位的运算
换而言之: 把要计算的数据转成二进制做运算 !
& 按位与
&0清零,&1保持不变
两个被操作数都转换为二级制,然后按位进行对比:
见0为0 全 1 则 1
A & B 为例子:
A->转成二进制; B->转成二进制!
假如A = 10 对应二进制是: 1010
假如B = 14 对应二进制是: 1110 &
其相与后的结果为: 1010 = 10 = 0x0A
| 按位或
两个被操作数都转换为二级制,然后按位进行对比: 见1 为 1 全0则0
A & B 为例子:
A转成二进制 B转成二进制!
假如A = 10 -> 1010
假如B = 14 -> 1110 |
其按位或后的结果为 : 1110 = 14
~ 按位取反
先将数据转换为二进制 ,之后对每一位都进行转变:0 变 1 , 1 变 0。例如:
unsigned char A =10;
unsigned char B = ~A;
~B == ~0000 1010 其按位取反后的结果为:
1111 0101 = 0xF5
^ 按位异或
异或 :两个被操作数都转换为二级制,然后按位进行对比:相同为0 不同为1
假如A = 10 -> 1010
假如B = 14 -> 1110 ^
按位异或后的结果 0100 = 4
<< 按位左移
假如一个数需要左移(x)位,那么对应计算方法为 :高位舍去 (x) 位, 低位补 (x) 位0
a<<1 也可以理解为 a 乘以2
unsigned char A = 0x10 为例子
unsigned char B = A << 1;
A -> 0001 0000 << 1 == 0x10<<1 == 16<<1
结果为: 0010 0000 == 0x20 == 32
unsigned char C = A << 3;
A * 2 * 2 * 2 = 16*8 = 128
1000 0000
>> 按位右移
低位舍去 高位补0
本质实际上是 移动一位 除以2
unsigned char A = 0x10 对应十进制为: 16
unsigned char B = A >> 2;
0001 0000 >> 2
第一次右移: 0000 1000 对应十进制为: 8
第二次右移: 0000 0100 对应十进制为: 4
位操作混合使用 嵌入式常用

&=~ 清0符
&=~ 是位运算组合,核心作用是「精准清零指定位,其他位不变」;
用法公式:变量 &= ~掩码,掩码中为 1 的位对应变量的位会被清零;
优势:比直接赋值更安全,不会误改其他位,是位操作的经典最佳实践。
|= 置1 符
|= 是按位或赋值,核心是「把变量中掩码为 1 的对应位设为 1,其他位不变」;
用法公式:变量 |= 掩码,掩码中 1 的位置就是要置 1 的位;
^= 取反符
^= 是按位异或赋值,核心作用是「精准翻转变量中掩码为 1 的对应位,其他位不变」;
用法公式:变量 ^= 掩码,掩码中 1 的位置就是要翻转的位,且多次执行可还原原状态;
更多推荐


所有评论(0)