17.位运算基础及实战要点
2020-08-13 本文已影响0人
一角钱技术
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) == 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
部分图片来源于网络,版权归原作者,侵删。