题目:比如给个5,5二进制为101,有两个1因此输出2.
很多人都会觉得简单写出以下程序
int Count_one_bits(int n)
{
int count = 0;
while (n)
{
if (n & 1)
count++;
n = n >> 1;
}
{
int count = 0;
while (n)
{
if (n & 1)
count++;
n = n >> 1;
}
return count;
}
}
但是这个代码是有问题的,
如果给出的数是负数,则进行算数移为,就会进入死循环。怎样解决呢?
把上面这个方法改进,每个整数都有32位,分别将这些位与1按位与,如果为真,则count++
int Count_one_bits(int t)
{
int count = 0;
for (int i = 0; i < 32; i++)
{
{
int count = 0;
for (int i = 0; i < 32; i++)
{
if (t & 1 )
{
count++;
}
t = t >> 1;
{
count++;
}
t = t >> 1;
}
return count;
return count;
}
但是这个是很麻烦的,对于每一个数都要判断32位
接下来我们看下如下例子
8 & 7 = 0
1000 0111 000
5 & 4 = 4
101 100 100
可以发现n&(n-1)的结果与n相比,其二进制中1个数少了一位,根据这种规律我们给如下代码
int Count_one_bits(int n)
{
int count = 0;
while (n)
{
n = n&(n - 1);
count ++;
}
return count;
{
int count = 0;
while (n)
{
n = n&(n - 1);
count ++;
}
return count;
}