一个函数返回参数二进制中的1的个数

本文介绍了一种高效统计二进制数中1数量的方法,通过不断将数字与其减一后的结果进行按位与操作,直至结果为0,以此来减少循环次数,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 正数的原反补码相同,我们要统计二进制位中一的个数,那就需要拿出三十二位bit位中的每一位,然后按位 &1,如果这一位的数字是1,那么完成&1的运算之后就会得到1,在之前先定义一个计数器,当出现1的时候,计数器就count++;然后再把剩下的31位数字整体右移一位,然后就可以继续执行按位&1的操作了,总共把之前的操作重复32次,就可以知道一个数字的二进制数中到底有多少个1.
   同样的,我们也可以用这种办法来测试一下一个数字转换为二进制数字之后有多少个0,但是需要注意转换。
   下面附上代码

#include<stdio.h>
#include<stdlib.h>
int main()
{   int n=0;
    int i=0;
	int count=0;
	printf("please input a integer number:\n");
	scanf("%d",&n);


	
	for(i=0;i<=32;i++)  //for循环控制右移次数,最多32次
	{
		if(((n>>i)&1)==1)    //将右移的结果&1
		{
			count++;     //是1则计数器+1
		}
	}
	printf("%d\n",count);
	system("pause");
	return 0;
}
在这里顺便说一下,-1有32个1,因为它是补码的存在形式,它的源码最高位为1,其他为0,然后存储时按补码存储,补码是最高位不变,其他按位取反,所以就出现了32个1.
   但是,这个程序美中不足的地方就在于当它每次执行完按位与的操作之后,整体都需要右移一次,时间复杂度大大增加,在这里,我再说一种简单的方法,我就用一些0和1来表示一个二进制数字,给你们演示一下这种算法是如何实现功能的。
      首先,我写一串数字来表示10      1010
  然后,我把这一整串数来表示9         1001  每次相与都会去掉一个1
  然后把10 &9,得到                           1000
                一直进行n&(n-1)                  0111
                                                            0000 最后1就全部被去掉了
具体代码我就不打了,这个程序相比上面的那个,就优化了很多,因为这个程序是一个二进制数字有几个1才循环相应的次数,最坏的情况下有32个1,才循环32次,如果只有3个或者4个,那只需要循环三次四次,大大减少了运行时间,所以我比较推荐这种。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值