对于求整数存储在内存中的二进制中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为正或负数都可以得到正确结果