Poison

二进制运算

异或

相同的 bit 进行异或运算结果为 0,不同则为 1。
若对 bit 进行异或 1 运算可以使对应 bit 取反,对 bit 进行异或 0 运算可以保持对应 bit 不变。

1
2
3
4
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
获取二进制表示中最低位的 1

因为 -x = ~x + 1 会使最低位的连续的 1 都变为 0,而最低位的 0 变为 1,所以我们使用 x & (-x) 可以得到最低位的 1:

1
2
3
4
5
6
7
8
9
若 x 的二进制表示为:
11010000
则 ~x 的二进制表示为:
00101111
则 -x = ~x + 1 的二进制表示为:
00110000

则 x & (-x) 的二进制表示为:
00010000
去除二进制表示中最低位的 1

因为 x - 1 会使最低位 1 右侧的 0 全部变为 1 且最低位 1 同时变为 0,所以我们使用 x & (x - 1) 可以去除最低位的 1:

1
2
3
4
5
6
若 x 的二进制表示为:
11010000
则 x - 1 的二进制表示为:
11001111
则 x & (x - 1) 的二进制表示为:
11000000