当我们想感知或改变某一个变量中的某一比特时,没有位运算,是很难实现的。
C/C++ 语言提供了六种位运算符:
& 按位与(双目)
| 按位或(双目)
^ 按位异或(双目)
~ 按位取反(单目)
<< 左移(双目)
>> 右移(双目)
1 按位与 "&"
多用于将某些比特位清零,而其他比特位保持不变。也可以用于获取变量中的某一位。
例如:将 int 型变量 n 的低 8 位保持不变,其余位清零。
n = n & 0xffffff00;
或
n &= 0xffffff00;
再例如:判断int型变量 n 的第 7 位(从右往左)是否为 1?
if ((n & 0x80) == 0x80) { ... }
2 按位或 "|"
常用于将变量中的某比特位设置为1,且保留其他比特位不变。
例如:将 int 型变量n的低8位全置为1,其余位保持不变。
n = n | 0xff;
3 按位异或 "^"
异或表示,异则为1,同则为0。
常用于将变量中的某些比特位取反,而保留其他比特位不变。
例如:将 int 型变量n的低8位取反,其余为保持不变。
n = n ^ 0xff;
异或运算有一个特点:
如果 a ^ b = c, 那么就有 c ^ b = a 以及 c ^ a = b (穷举法可证)
异或运算还有一个有趣的事情:不用临时变量,就可以交换两个变量的值。
int a = 5, b = 7;
a = a ^ b;
b = b ^ a;
a = a ^ b;
穷举法可证
4 按位非 "~"
"~"是个单目运算符,用于按比特位取反。例如:
char b = 0xF0;
a = ~b;
则a = 0x0F。
5 左移运算符 "<<"
高位丢弃,低位补0。
a = 9 << 4; // a = 144
左移1位,相当于乘2。左移比乘法运算快的多。
6 右移运算符 ">>"
低位丢弃,高位补符号位。
a = 9 >> 1; // a = 4
右移1位,相当于除2。除不尽则向小里取整。右移比除法运算快的多。
网友评论