n & (-n)
其中 -n 是 nn 的相反数,是一个负数。该位运算技巧可以直接获取 nn 二进制表示的最低位的 11。
由于负数是按照补码规则在计算机中存储的,-n的二进制表示为 n 的二进制表示的每一位取反再加上 1。
因此,如果 n是正整数并且 n & (-n) = n,那么 n 就是 2的幂。
n & (n−1)
其运算结果恰为把 n 的二进制位中的最低位的1变为0之后的结果。
如:6&(6-1) = 4, 6 = (110)_2, 4 = (100)_2
,运算结果 4 即为把 6 的二进制位中的最低位的 1 变为 0 之后的结果。
这样我们可以利用这个位运算的性质加速我们的检查过程,在实际代码中,我们不断让当前的 n 与 n−1 做与运算,直到 n 变为 0 即可。因为每次运算会使得 n 的最低位的 1 被翻转,因此运算次数就等于 n 的二进制位中 1 的个数。
int hammingWeight(uint32_t n)
{
int re= 0;
while (n) {
n &= n - 1;
re++;
}
return re;
}