统计二进制中1的个数

输入一个整数 n ,输出该数32位二进制表示中1的个数。其中负数用补码表示。

三种解法统计一个数的二进制形式中1的个数。(其实还有一种解法通过 /2 %2 的方式计算出他的二进制的每一位再统计,这里就不详细说明了)

方法一:

将n不断右移(>>),每次与1进行按位与运算(&),若结果为1,则说明n的最后一位是1,count++。

例如,n = 9时,二进制为 0000 1001(仅展示后8位),1的二进制为0000 0001。

若n & 1, 则二进制位上同为1才为1, 有0则为0,所以n&1的结果是0000 0001,count++;

接下来将n右移,右移的规则是,若n为无符号数,则左边补0,若n为有符号数,则左边补符号位,

右边溢出的一位丢弃。

这里的n是有符号数,符号位为0,所以右移后左边补0,即 0000 0100,此时再让n & 1

得到的是0000 0000,count不变。

以此类推,循环32次后就可以计算出有多少个位为1了。

其实 &1 是一种常用的方法,用来判断n的二进制的某一位是否为1。

方法二:其实思路跟方法一相似,只不过这一次我们不是将n右移,而是将1左移了。

左移的规则是右边补0,将0000 0001左移后,就变成了0000 0010,同样可以用来判断n的二进制每一位是否为1,这里的判断方式发生了一丝变化,只要( n &(1<<i))!= 0即可判断n的二进制这一位不是0,那么就是1了。

特别需要注意的是这里 “n &(1<<i)”外边的括号必须加上,因为&和|这两个运算符的优先级低于'>','<'和'=='这类的比较运算符的优先级。如果不加,那么相当于先判断(1<<i) != 0,就会出错,我也是找了好久才发现这个错误。

方法三:

有一个点需要知道:n & (n−1),会将n的二进制中最低位由1变成0。

举个例子:n = 12,二进制为 0000 1100

如果n-1,那么n = 11,二进制为 0000 1011

可以发现的是从右往左数第二个1后面的1都变成了0,0都变成了1

那么 n & (n-1) 就是 0000 1000,把最右边的一个1变成了0 。

因为从倒数第二个1以后0与1互换了,进行&运算以后当然就全部变成了0,相信这里应该很好理解吧。

每进行一次 n & (n-1) 运算,都会让n的二进制少一个1,那么可以进行多少次运算就说明有多少个1了吧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值