Skip to main content

位运算

判断两个数是否异号

利用补码编码的符号位, 如果小于 0, 则证明两数字异号, 这种方式可以用于小数. 当然, 你可以使用 Math.sign 分别判断两个数字的正负.

const isContrarySign = (-1 ^ 1) < 0 // true

const isContrarySign = (2 ^ 1) < 0 // false

n & (n - 1)

191-hamming-weight

其核心逻辑是 n - 1 一定可以消除最后一个 1, 同时把其后的 0 都变成 1, 这样再和 n 做一次 & 运算, 就可以仅仅把最后一个 1 变成 0 了.

按位异或(XOR)

这三条可以针对任何进制

  • a ^ a = 0
  • a ^ 0 = a
  • a ^ -1 = ~a

对于二进制

aba XOR b
000
011
101
110

扩展

关于位运算的更多骚操作可以戳 Bit Twiddling Hacks.