分享一下求十进制数再二进制情况下,数字1的个数

本文介绍了三种计算二进制数字中1的个数的方法:通过位运算(%2和右移)、检查第一位(逻辑与)、以及通过逐位减一。这些方法适用于正整数和正负数,通过实例演示和解释了它们的逻辑和代码实现。
摘要由CSDN通过智能技术生成

ss今天和大家分享一下求二进制数字1的个数的方法

1.先回顾一下^ & | 的规则方法

^ 在二进制下,一位与一位^的时候,相同的情况下(同时为零或者同时为一),它的结果就是1,不同的话就是零。

& 一位一位的&,得同时为1,(两个位置&)结果才是1,否则为0。

| 一位一位的|,两个位都为0时,结果才为0。

2.ss先介绍一下求正整数的,因为正整数的原码反码补码三者都是一样的,所以这种方法有局限性。

我们可以知道 二进制的第一位,是2的零次方乘以这个位上的数,其他的位置都是二的各种次方,所以其他位都是二的倍数,如果第一位为一的话,那么这个数%2一定有1,所以我们只要%2一次,右移一位即可,直到这个数为零,思路清晰,代码实操。

int main()
{
	int a = 32527,count=0;
	
	for (int i = 0; i < 32; i++)
	{
		
		if (a % 2 == 1)
		{
			count++;
		}
		
		a = a >> 1;
	}
	
	printf("%d", count);
	return 0;
}

第二种方法和第三种方法都是正负数都使用

第二种 1的二进制第一位就是确定的1,所以我们要检查第一位是不是1,那我们直接&,是1 的话就为1,不是1的话则为零,然后再进行右移,知道为零。

int main()
{
	int a = 32527,count=0;
	
	for (int i = 0; i < 32; i++)
	{
		
		if ((a & 1)== 1)
		{
			count++;
		}
		
		a = a >> 1;
	}
	
	printf("%d", count);
	return 0;
}

为什么再if的括号里面加一个括号呢,因为&与==的优先级

第三种:我们可以知道,减一就会把二进制的第一位改变成相反的(0->1或者1->0),然年后其他位置的一就会移动位置,但是数字1的个数并没有变化,ss就不实际操作了,大家可以举个数字试试,每次&就会减掉一个1,所以我们只要每次把最后一位减一,两个值进行&,得到的结果就可以计算了,

int main()
{
    int a = 32527,count=0;
    
    while (a)
    {
        a &= a - 1;
        count++;
    }
    
    printf("%d", count);
    return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值