方法一:
思路:采用位运算一位一位的检测,将每一位与1按位与,如果结果等于1,计数器就加1,具体代码如下:
int count_one_bit(unsigned int n)
{
int count = 0;
int i = 0;
for(i=0; i<32; i++)
{
if(((n>>i)&1) == 1)
count++;
}
return count;
}
方法一的缺陷:不管是什么数据,都要执行32次。
方法二:
思路:在方法一的基础上加上,在每次移位后判断这个数是否等于0,等于0的话提早结束,不需要执行32次。例如:7--->00000000 00000000 00000000 00000111 判断3次,判断这个数是否等于0 ,等于0就可以结束了。
int count_one_bit(unsigned int n)
{
int count = 0;
while (n != 0) {
if((n & 1) != 0) {
count++;
}
n = n >> 1;
}
return count;
}
方法一的缺陷:虽然解决了小的数字可以不用执行32次,但是大的数字,还是要执行很多次。
方法三:(最优解)
思路:假设要求的n与n-1按位与数字为n,将n与n-1按位与,直到n按位与到等于0,此过程执行了多少次n与n-1按位与,就是有多少个1。
int count_one_bit(int n)
{
int count = 0;
while(n)
{
n = n&(n-1);
count++;
}
return count;
}