第一个技巧
n & (n - 1)
其中 & 表示按位与运算。
该位运算技巧可以直接将 n 二进制表示的最低位 1 移除,它的原理如下:
假设 n 的二进制表示为 (a10⋯0) 2,其中 a 表示若干个高位,1 表示最低位的那个 1,0⋯0 表示后面的若干个 0,那么 n−1 的二进制表示为:(a01⋯1)2
我们将 (a10⋯0)2 与 (a01⋯1)2进行按位与运算,高位 a 不变,在这之后的所有位都会变为 0,这样我们就将最低位的那个 1 移除了。
第二个技巧是
n & (-n)
其中 −n 是 n 的相反数,是一个负数。该位运算技巧可以直接获取 n 二进制表示的最低位的 1。
由于负数是按照补码规则在计算机中存储的,−n 的二进制表示为 n 的二进制表示的每一位取反再加上 1,因此它的原理如下:
假设 n 的二进制表示为 (a10⋯0)2,其中 a 表示若干个高位,1 表示最低位的那个 1,0⋯0 表示后面的若干个 0,那么 −n 的二进制表示为:
(aˉ01⋯1)2+(1)2 =(aˉ10⋯0)2 其中 aˉ表示将 a 每一位取反。我们将 (a10⋯0)2与 (aˉ10⋯0)2进行按位与运算,高位全部变为 0,最低位的 1 以及之后的所有 0 不变,这样我们就获取了 n 二进制表示的最低位的 1。