位运算概述
从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态,计算机对二进制数据进行的运算(+、-、*、/)都是叫位运算,即将符号位共同参与运算的运算。
符号 | 描述 | 运算规则 |
---|---|---|
& | 与 | 两个位都为1时,结果才为1 |
| | 或 | 两个位都为0时,结果才为0 |
^ | 异或 | 两个位相同为0,相异为1 |
~ | 取反 | 0变1,1变0 |
<< | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 |
>> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
指定位置的位运算
- 将 x 最右边的 n 位清零:
x & (~0 << n)
- 获取 x 的第 n 位值(0 或者 1):
(x >> n) & 1
- 获取 x 的第 n 位的幂值:
x & (1 << n)
- 仅将第 n 位置为 1:
x | (1 << n)
- 仅将第 n 位置为 0:
x & (~ (1 << n))
- 将 x 最高位至第 n 位(含)清零:
x & ((1 << n) - 1)
实战位运算要点
-
判断奇偶:
x % 2 == 1 —> (x & 1) == 1
x % 2 == 0 —> (x & 1) == 0
-
x >> 1 —> x / 2.
即: x = x / 2; —> x = x >> 1;
`mid = (left + right) / 2; —> mid = (left + right) >> 1; `
-
X = X & (X-1)
清零最低位的 1 -
X & -X
=> 得到最低位的 1 -
X & ~X
=> 0