首先,我这里有三种方法。
我们知道的是他是二进制数,我们可以一位一位的判断是不是1。这里,我们可以联想到在求一个十进制数的每一位用到的方法,先取模10,得到最后一位,再整除10去掉该位。所以,用到二进制数里面,我们就变成了%2和/2。
代码如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int count_bit(unsigned int m)//注意这里是无符号
{
int count = 0;
while (m)
{
if (m % 2 == 1)
{
count++;
}
m /= 2;
}
return count;
}
int main()
{
int i = 0;
scanf("%d", &i);
int count = count_bit(i);
printf("%d", count);
return 0;
}
这里,我用-1为例测试?,结果为
这里,跟第一种方法相差不大,只是这里我们用到了移位操作符>>。
若让一个数与1进行按位与操作,,则它的最后一个二进制位为1则得到1,为0得到0。
所以我们借助循环和>>与&这两个操作符,判断每一位是否为1。
代码如下:
int count_bit(int m)//这里就用有符号即可。
{
int count = 0;
for (int j = 0; j < 32; j++)//整形有32位
{
if ((m >> j && 1) == 1)
{
count++;
}
}
return count;
}
int main()
{
int i = 0;
scanf("%d", &i);
int count = count_bit(i);
printf("%d", count);
return 0;
}
?第三种的精髓还是按位与&这个操作符。其实有种方法可以让一个数的二进制位中1一个一个的消除,不管它在哪儿,当然是从最低位开始。就是n&(n-1),大家可以试试。所以这里用while循环,当n二进制位全为0时停止循环,即n=0。
代码如下:
int count_bit(int m)
{
int count=0;
while (m)
{
m = m & (m - 1);
count++;
}
return count;
}
int main()
{
int i = 0;
scanf("%d", &i);
int count = count_bit(i);
printf("%d", count);
return 0;
}
至此,三种方法都已经介绍完,希望有帮助。
祝:“码”思泉涌,下“指”如有神。?