求整数在内存中的二进制中1的个数

对于求整数存储在内存中的二进制中1的个数这个问题,我们有三种方法。

方法一

用循环的方法,直到n被缩减为0:

1. 用该数据模2,检测其是否能够被2整除    

2. 如果可以:则该数据对应二进制比特位的最低位一定是0,否则是1,如果是1给计数加1    

3. 如果n不等于0时,继续1

最后打印出计数即可,代码如下

但该方法有一定的缺点:进行了大量的取模以及除法运算,取模和除法运算的效率本来就比较低。同时我们现在的n是有符号的n,如果我们输入-1,并不会得到我们想要的结果(32),而是输出的0,所以需要改为无符号整数(unsigned int)

方法二:

用按位与操作符&(有0就为0,两个都是1才为1)一位一位地检测。

该方法与方法一相比:用位操作代替取模和除法运算,效率稍微比较高 ,同时n为正或负数都可以得到正确结果

缺点:不论是什么数据,循环都要执行32次

方法三:

采用相邻的两个数据进行按位与运算

例如:99:1100011

第一次循环:n=99   n=n&(n-1)=99(1100011)&98(1100010)=98(1100010) 

第二次循环:n=98   n=n&(n-1)=98(1100010)&97(1100001)=96(1100000)

第三次循环:n=96   n=n&(n-1)=96(1100000)&95(1011111)= 64(1000000)

第四次循环:n=64   n=n&(n-1)=64(1000000)&63(0111111)= 0

从该方法可以看出,数据的二进制比特位中有几个1,循环就循环几次,而且中间采用了位运算,处理起来比较高效,同时n为正或负数都可以得到正确结果

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值