位运算
拥有举足轻重的地位
最高效的计算
掌握它,你讲拥有整个二进制世界
8 过,代码可读性很差了
与 and &
&1
判断数 n 的第 m 位
(n >> m) & 1
判断奇偶
n & 1
奇数最后一位是 1
&0
将 n 的第 m 位置 0
n & ~(1 << m)
- 先在 m 位置上定位 1
- 然后全部去反,m 位置 0,其余全 1
- 与 1 是不影响原来位置的,与 0 需要第 m 位是 0 才得 1,
1 & 0 == 0
或 or |
|1
将 n 的第 m 位置 1
n | (1 << m)
无条件给 1
|0
实际无作用,可以作为一个兜底的开关,其逆否条件就是&1
异或 xor ^
相同得 1,不同的 0
^1
将 n 的第 m 位取反
n ^ (1 << m)
^0
也毫无实际作用,都是原来的值
左右移动 shl shr << >>
左移
高位丢弃,低位补 0
相当于是乘 2,左移 n 位就是乘 2^n^,比乘法快的多
右移
对于有符号数,cpp 中 long,int,short,char 类型,会带着符号位一起,同时最高位补充原本的符号位
右移 n 相当于是除以 2^n^,向下取整,
-25 >> 4 = -2
应用
TODO https://tomotoes.com/blog/magic-bit-operation/ (opens in a new tab)
用 cpp 实现一下