算法题——二进制中1的个数

本文探讨了一个二进制运算的规律:一个二进制数减1后再与原数进行按位与(&)运算,会消除最右边的1。通过举例说明了这一过程,无论是最右边为1还是0的情况,都能证明此规律的正确性。该规律对于理解二进制运算和位操作有重要意义。
摘要由CSDN通过智能技术生成

思路:
1.利用一个结论:一个二进制数n减1后与原二进制数进行 & 运算( 即n&(n-1) )会消去最右边的1。
2. 这个结论怎么来的
假设二进制数101进行减1运算,刚好最右边是1,则得到100,此时用100跟101做&运算,得到的是100,故消去了101左右边的1。
1 0 0减1呢?最低位是0,跟十进制减法一样,向高位借。(可以脑补一下十进制100减1的过程)
所以二进制1 0 0减1的运算过程如下:

最右边的0向右数第二位借1得:2-1=1,
右数第二位还是0,却要借给最右边那位1,所以它也得向高位借。
这样右数第三位的1借给它1之后变成0,右数第二位借1得:2-1=1。
所以得到新数为0 1 1。
观察一下刚刚的运算过程可以发现:

如果最右边刚好是1(如101),进行减1运算就不用向高位借,直接得0,高位则保持原样不变(得100)。
再把减1后得到的数与原数 & 运算(即101&100=100)可知高位都不变那就是消去最右边的1(由这可能还不太明显是消去最右边的1,继续看下面的)

如果最右边是0(如100),进行减1运算,则需要像高位借,而最终会导致最近的高位1因为被借走1而变0,而比它高的高位保持原样不变(得011),再跟原来的数进行&运算(即100&011=000);
所以由以上两点可知二进制数每次减1后与原数进行&运算会消去最右边的1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值