题目描述
题目分析
很自然地想到了二进制枚举,直接循环检查每一个二进制位。
class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;uint32_t t = 1;for (int i = 0; i < 32; ++i, t <<= 1) {if (n & t) {++ret;}}return ret;}
};
AC之后看了一下题解,发现还有更妙的方法:使用一个trick:n&(n-1)
的结果是把n的二进制位的最低位从1变为0。其实挺好理解的,因为n-1
肯定会将最低位1变成0,并把之后所有位变为1,使用&操作以后就可以消除掉。
有了上面的技巧,我们只需要不断地将n
变为n&(n-1)
class Solution {
public:int hammingWeight(uint32_t n) {int ret = 0;while(n) { //必须首先判断n是否为0++ret;n &= (n - 1);}return ret;}
};