编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为 汉明重量).)
这题有多种写法,但是大都比较相似,我这就写出两个相差比较的方法。
首先我们得知道无符号整形有32个二进制位,也就是说它最多有32个1,所以我们可以使用向左位移31次,每次移动一次,然后去和1按位与(都为1才为1),如果得到1,就说明该位置1,我们就记录,如果不是,我们就继续移动,直到我们弄完为止。
int hammingWeight(uint32_t n)
{
int amount = 0;
int i = 0;
for (i = 0; i < 32; i++)
{
if ((n >> i) & 1)
amount++;
}
return amount;
}
上面那个不论几个1都得循环32次,但这个就不同了,这个有多少1就循环多少次。如一个数为3,他的二进制数为011,他的减一为2,二进制为010,让它与它的n-1按位与得010,刚好将它最左变得1给去掉,一直循环下去,直到全部变为0为止。
int hammingWeight(uint32_t n)
{
int amount=0;
while(n)
{
amount++;
n=n&(n-1);
}
return amount;
}