位操作符使用整数作为操作数,位操作符将整数视为二进制位的集合,为每一位提供校验和设置的功能
在C中,我们通常会使用位操作符,如果使用的语言为C++,一般建议使用std::bitset
几种位操作符
<< 左移 -- 移动后,右边插入0以补充空位
>> 右移 --移动后,左边插入0以补充空位
& 与 --左右操作数,相同位都为1,操作结果该位才为1
| 或 --左右操作数,相同位有一个为1,操作结果就为1
~ 非 --只有一个操作数,对操作数每一位都取反
^ 异或 --左右操作数,对应的位不相同时,操作结果为1
比如 1000 >> 3 --> 1111101000 >> 3 --> 0001111101 --> 125
1000<<3 --> 1111101000 <<3 --> 1111101000000 --> 8000
100 & 10 --> 1100100 & 0001010--> --> 0000000 --> 0
~100 --> ~1100100 ?
--> No 这里要分场景,如果是在32位机器下100 --> 0000000000 0000000000 0000011001 00
--> ~100 --> 1111111111 1111111111 1111100110 11
100|10 --> 1100100 | 0001010 --> 1101110 --> 110
100^10 --> 1100100 | 0001010 --> 1101110 --> 110
//位操作符操纵的整数的类型可以是有符号的也可以是无符号的。如果操作数为负数,则位操作符如何处理其操作数的符号位依赖于机器
几个简单应用
1、指定位 置0
num & ~(1 << (pos -1) )
比如100 --> 1100100 --> 将第三位置0 --> 1100000 --> 96
pos = 3 --> pos -1 --> 2
1<<2 --> 100 --> ~100 --> 1111111..... 0 11 (第3位为0,其他全为1)
2、指定位置1
num | 1<<(pos-1)
3、取指定位的值
( num >>(pos -1) ) & 1