目录
首先你可能会这样写
用NumOf1函数实现标题的功能
int NumOf1(int n)
{
int count = 0;
while (n)
{
if (n % 2)
count++;
n /= 2;
}
return count;
}
int main(void)
{
int n = 0;
scanf("%d", &n);
printf("%d\n", NumOf1(n));
return 0;
}
通过%2 / 2 求得二进制中1的个数,有点类似求我们平时求某个数的每一位(二进制的每一位不就是0/1吗)
但是当你输入-1时。。。。
我们用位操作符可以轻松解决
int count = 0;
int i = 0;
for (i = 0;i < 32;i++) //int 4个字节 32个bit位
{
if ((n >> i) & 1) //让二进制序列的32位一次一次的全部右移,按位与1,是1为真,count++
{
count++;
}
}
return count;
还有一个很难想到的算法
int count = 0;
while (n)
{
count++;
n &= (n - 1);
}
return count;