方法一使用位移操作
int NumberOf1(int n)
{
int count = 0;
while(n){
if(n & 1){
count++;
}
n = n >> 1;
}
return count;
}
这种解法是将数据n每次右移一位和1进行&运算来求得二进制中1的个数,对于无符号数来说没有问题,可是对于有符号数问题就大了,极有可能造成死循环。当n为负数时,n右移在最高位补1(为了保证数据为负数),因而最终就会形成死循环。可以改为
int NumberOf1(int n)
{
int count = 0;
int temp=1;
for(int i=0;i<32;i++)
{
if(n & temp){
count++;
}
temp = temp << 1;
}
return count;
}
方法二,使用一个性质:把一个整数减去1之后再和原来的整数做按位与,得到的结果相当于是把整数的二进制表示中最右边的一个1变成0
int NumberOf1(int n)
{
int count = 0;
while(n){
count++; //只要n不为0则其至少有一个1
n = n & (n - 1);
}
return count;
}