题目描述:编写一个函数,输入是一个无符号整数,返回的是它所有 位1 的个数(也被称为汉明重量)。
例如,32位整数 '11'
的二进制表示为 00000000000000000000000000001011
,所以函数返回3
。
题目来源: leetcode
方法一:利用整数除法的特点,通过相处和判断余数的值进行分析。
代码语言:javascript复制int count(int a)
{
int count = 0;
while(a)
{
if(a % 2 == 1)
{
count ;
}
a /= 2;
}
return count;
}
方法二:使用位运算。位运算符当中的右移运算符每一次移动一位,其实与除以2是等价的。进行掩码运算,取当前二进制数的最后一位。
代码语言:javascript复制int count(int a)
{
int count = 0;
while(a)
{
count = a & 0x00000001;//获取当前二进制数的最后一位,为0或1。
a >>= 1;//相当于除以2
}
return count;
}
方法三: 有技巧的位与运算。 举例: 如二进制数 1001 0010 进行减一操作后 0110 1101 然后进行位与运算 10010010 & 01101101 = 0,证明原二进制数一个2的N次方值。
代码语言:javascript复制int count(int a)
{
int count = 0;
while(a)
{
a &= (a-1);
count ;
}
return count;
}