C语言计算一个整数的补码中有几个1

这篇博客探讨了如何计算数字在内存中补码表示时1的个数。提供了两种方法,第一种适用于正整数,通过位移和计数计算1的个数;第二种方法能够处理负数的补码,同样利用位移和计数。还介绍了一个更简洁的算法,通过n与n-1的按位与操作来减少1的个数,从而统计二进制中1的数量。
摘要由CSDN通过智能技术生成

数字在内存中是以补码的形式来储存的  补码减一等于反码 反码中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;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值