17.位运算基础及实战要点
- 位运算符
- 算数移位与逻辑移位
- 位运算的应用
为什么需要位运算
- 机器里的数字表示方式和存储格式就是二进制
- 十进制 <——> 二进制:如何转换?
如何从十进制转换为二进制
4(d):0100
8(d):01000
5(d):0101
6(d):0110
位运算符
| 含义 | 运算符 | 示例 |
|---|---|---|
| 左移 | << | 0011 => 0110 |
| 右移 | >> | 0110 => 0011 |
| 按位或 | | | 0011 ---=> 1011 1011 |
| 按位与 | & | 0011 ---=> 0011 1011 |
| 按位取反 | ~ | 0011 => 1100 |
| 按位异或(相同为零不同为一) | ^ | 0011 ---=> 1000 1011 |
XOR - 异或
异或:相同为0,不同为1。也可用 “不进位加法” 来理解。
异或操作的一些特点:
x^0 = x
x^1s = ~x // 注意 1s = ~0
x^(~x) = 1s
x^x = 0
c = a^b => a^c = b, b^c = a //交换两个数
a^b^c = a^(b^c) = (a^b)^c //associative
指定位置
- 将 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) == 0x>>1—>x/2
即:x=x/2; —> x=x>>1;
mid=(left+right)/2; —> mid=(left+right)>>1;X=X&(X-1)=> 清零最低的1X&-X=> 得到最低的1X&~X=> 0
部分图片来源于网络,版权归原作者,侵删。