位运算
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都是1,结果才是1;只要有一个为0,其值为0 |
| | 或 | 两个位都是0,结果才是0;只要有一个为1,其值为1 |
^ | 异或 | 两个位相同是0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,高位补0或者符号位补齐 |
& 与运算
运算规则
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
总结
只有两位同时为1时,结果才为1,否则结果为0。
用途
- 清零: 如果想将一个单元清零,只要与一个各位都为零的数值相与,结果为零。
- 取一个数的指定位: 例如,取数 X = 1010 1110 的低4位,只需另找一个数 Y = 0000 1111,然后 X & Y = 0000 1110 即可得到 X 的指定位。
- 判断奇偶: 通过判断最未位是0还是1来决定奇偶,可以用 if ((a & 1) == 0) 代替 if (a % 2 == 0) 来判断 a 是否为偶数。
| 或运算
运算规则
0 & 0 = 0
0 & 1 = 1
1 & 0 = 1
1 & 1 = 1
总结
只要有一个为1,其值为1。
用途
- 设置某些位为1: 例如,将数 X = 1010 1110 的低4位设置为1,只需另找一个数 Y = 0000 1111,然后 X | Y = 1010 1111 即可得到。
^ 异或运算
运算规则
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
总结
相应位相同为0,相异为1。
性质
- 交换律
- 结合律: (a ^ b) ^ c == a ^ (b ^ c)
- 对于任何数 x,都有 x ^ x = 0,x ^ 0 = x
- 自反性:a ^ b ^ b = a ^ 0 = a
用途
- 翻转指定位: 例如,将数 X = 1010 1110 的低4位翻转,只需另找一个数 Y = 0000 1111,然后 X ^ Y = 1010 0001 即可得到。
- 与0相异或值不变: 例如 1010 1110 ^ 0000 0000 = 1010 1110
- 交换两个数:
void Swap(int &a, int &b) {
if (a != b) {
a ^= b;
b ^= a;
a ^= b;
}
}
~ 取反运算
运算规则
~1=1111 1110 ~1=-2
~0=1111 1111 ~0=-1
总结
将 0 变 1,1 变 0。
用途
- 使一个数的最低位为零: 例如,使 a 的最低位为0,可以表示为:a & 1。1 的值为 1111 1111 1111 1110,再按"与"运算,最低位一定为0。
左移运算符(<<)
定义:
将一个运算对象的各二进制位全部左移若干位,高位丢弃,低位补0。
例如,设 a = 1010 1110,a = a << 2 将 a 的二进制位左移2位、右补0,即得 a = 1011 1000。
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
右移运算符(>>)
定义:
将一个数的各二进制位全部右移若干位,高位补0或补符号位,右边丢弃。
例如,a = a >> 2 将 a 的二进制位右移2位,左补0 或补符号位,具体取决于数的正负。
操作数每右移一位,相当于该数除以2。