位运算

拥有举足轻重的地位

最高效的计算

掌握它,你讲拥有整个二进制世界

8 过,代码可读性很差了

与 and &

&1

判断数 n 的第 m 位

(n >> m) & 1

判断奇偶

n & 1奇数最后一位是 1

&0

将 n 的第 m 位置 0

n & ~(1 << m)

  1. 先在 m 位置上定位 1
  2. 然后全部去反,m 位置 0,其余全 1
  3. 与 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 实现一下

对 2 的整数幂进行模运算

两数交换

判断 2 的正整数幂

判断奇偶性