题目描述
题目分析
很自然地想到了二进制枚举,直接循环检查每一个二进制位。
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;
}
};