注意!一般我们进行 位运算 都是针对 补码 进行操作的,且需要注意操作的是 有符号数 还是 无符号数

位运算

非(NOT)

  • 一元运算符,按位取反。

与(AND)

  • 二元运算符,只要一个为 0,则返回 0。

  • 一个数 a-a 进行 AND 操作可以得到「除了 a 的最后一位保留为 1 以外其他位全部为 0」的 mask。

或(OR)

  • 二元运算符,只要一个为 1,则返回 1。

异或(XOR)

  • 二元运算符,两个位不同则返回 1。
  • 一个数 a 与自身异或等于 0,即 a XOR a = 0
  • 一个数 a0 异或得到 a 自身,即 a XOR 0 = a
  • 异或操作满足交换律和结合律,即 a XOR b XOR a = (a XOR a) XOR b = 0 XOR b = b

移位

移位操作分为三种:逻辑移位算术移位循环移位

对于 逻辑移位 来说,不考虑符号位

  • 逻辑左移:所有位左移一位,最低位补 0。
  • 逻辑右移:所有位右移一位,最高位补 0。

对于 算术移位 来说,需要考虑符号位

  • 算术左移:所有位左移一位,符号位改为原符号位,尾部补 0。
  • 算术右移:所有位右移一位,符号位改为原符号位。

对于 循环移位 来说:

  • 循环左移:所有位左移一位,溢出的原最高位放在最低位。
  • 循环右移:所有位右移一位,溢出的原最低位放在最高位。

参考