输入一个整数,返回这个数二进制中1的个数
第一种方法
int One(int n)
{
int count = 0;
while (n)
{
if (n & 1)
count ++;
n = n>>1;
}
return count;
}
这种方法可能使大家第一时间想到的,输入正数可以正确计算,输入负数程序却会奔溃,因为一个数向左移n位,就会补足n个第一位数字,如 0000 0000 0000 1111 >> 3 = 0000 0000 0000 0001, 1000 0000 0000 1111 >>3 = 1111 0000 0000 0001,这样程序就会死循环
第二种方法:
int One(int n)
{
int count = 0;
unsigned int flag = 1;
while (flag)
{
if (n & flag)
count ++;
flag = flag << 1;
}
return count;
}
左移最后一位补0,方法可行,但每次都要循环32次,效率不如下面这种方法
int One(int n)
{
int count = 0;
while (n)
{
++ count;
n = (n - 1)&n;
}
return count;
}
n & (n-1) 的每次的结果都会把二进制的最后一个1消掉
如 n n -1 n & (n-1)
1100 0101 1100 0100 1100 0100
1100 0100 1100 0001 1100 0000
1100 0000 1000 0001 1000 0000
1000 0000 0000 0001 0000 0000
所以有几个1就会循环几次 ,这样效率就会高上很多