数字在内存中是以补码的形式来储存的 补码减一等于反码 反码中1换成0 0换成一就是源码
正整数的源反补码是相等的 这几个码都是2进制形式的
假如我们输入的是三 三的补码是011其中有2个1
1
代码如下
#include <stdio.h>
int main()
{
int a;
printf("请输入一个整数:");
scanf("%d", &a);
int b = 0;
while (a)
{
if (a % 2 == 1)
{
b++;
}
a /= 2;
}
printf("%d的补码中1的个数为:%d", a, b);
return 0;
}
不足之处 不能计算负数中的补码中1的个数
第2种方法
#include <stdio.h>
int main()
{
int a;
printf("输入a的值:");
scanf("%d", &a);
int b = 0;
int i = 0;
for (i = 0; i < 32; i++)//整数占字节4,1字节8比特位一共可以放置32个2进制数
{
if ((a>>i & 1) == 1)//使用位移运算与一进行按位与计算假如为一说明最后一个数为1
{ //每按位与计算一次就在进行一次位移计算
b++;
}
}
printf("%d的反码中1的个数为%d", a, b);
return 0;
}
这种方法可以计算负数的补码中1的个数
还有一个更简便的方法
int cout(int n)
{
int cout=0;
while(n)
{
n=n&(n-1); //比如n=13 二进制为1101 n-1=1101 则n&n-1=1100 n=1100 n-1=1011
cout++; // n&n-1=1000 n=1000 n-1=0111 n&n-1=0 由此可见每一次n=n&n-1的运算
//都会使最左边的1消失 所以在加一个计数器就可以知道二进制有几个1了
}
return cout;
}