您的位置:首页 > 其它

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

2017-11-23 16:01 232 查看
 正数的原反补码相同,我们要统计二进制位中一的个数,那就需要拿出三十二位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个,那只需要循环三次四次,大大减少了运行时间,所以我比较推荐这种。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐