1、直接位移计算
int hammingWeight(int n) {
int res = 0;
for (int i = 0; i < 32; ++i) {
res += (n & 1);
n = n >> 1;
}
return res;
}
2、n和n-1进行与运算去除最后末尾的1
int hammingWeight(int n)
{
int count=0;
while (n != 0)
{
n &= n - 1;
++count;
}
return count;
}
3、使用递归的巧妙存储方式
将数字中的二进制两两分组 | 00 | 00 | 00 | 00 这样n与0x55进行&运算后,只有每组低位置上的1能够保留。同理n>>1也进行同样运算得到高位置上的1保留。两个结果相加不会进位,因为1的个数在2分组时肯定可以用2位存储。得到结果后再将其看作四个分组 |0000 |0000 分别与0xFF运算得到后再相加就是最终结果,因为结果都在最后的位置上保存。
int hammingWeight(int n)
{
n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
n = (n & 0x0F0F0F0F) + ((n >> 4) & 0x0F0F0F0F);
n = (n & 0x00FF00FF) + ((n >> 8) & 0x00FF00FF);
n = (n & 0x0000FFFF) + ((n >> 16) & 0x0000FFFF);
return n;
}