题目翻译:
写一个函数,将一个无符号整数并返回数字“1”位有(也被称为汉明重量)。
例如,32位整数“11”具有二进制表示0000000000000000000000000000 1011,所以函数应该返回3。
分析:DONE
1,
首先这个数是正整数,题目说的很清楚
每次循环减少该数n二进制最右边的1 ---》n=n&n-1
比如有5个1,则循环5次(减少5次)
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt=0;
while(n)
{
cnt++;
n=n&n-1;//减少一个二进制中最右边的1
}
return cnt;
}
};
或者写成如下:
class Solution {
public:
int hammingWeight(uint32_t n) {
int cnt=0;
while(n)
{
if(n&1)//判断当前数的末尾是否为1
cnt++;
n=n>>1; //将n往右移一位
}
return cnt;
}
};
2,学习别人的算法:
stl中的位运算类,bitset,讲道理这里不符合要求。
class Solution {
public:
int hammingWeight(uint32_t n) {
bitset<32> cntbit(n);
return cntbit.count();//count()函数统计二进制中1的个数
}
};
注:本博文为EbowTang原创,后续可能继续更新本文。如果转载,请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50364774
原作者博客:http://blog.csdn.net/ebowtang