分析:
思路一:
运用位运算,我们可以利用与运算,当当前位和1与是1,则个数加1,是0则跳过。
代码如下所示:
class Solution {
public:
int hammingWeight(uint32_t n) {
int count=0;
long flag=1;
for(int i=0;i<32;++i)
{
if(flag&n) count++;
flag<<=1;
}
return count;
}
};
为什么不右移原来的数和一个固定的1来做运算呢,讲道理这里是32位,固定的好像也没问题,但是只是怕右移的符号扩展问题。
还有一个细节是flag是long类型的,不过不是很懂为什么int越界。。。
结果如下所示:
思路二:
数学思路:一个二进制数减一和原来的数做与可以消掉末尾的1
按照这种思路写代码也很简单:
class Solution {
public:
int hammingWeight(uint32_t n) {
int count=0;
while(n)
{
++count;
n=(n-1)&n;
}
return count;
}
};
结果如下所示: