“n&-n“得到n最低位的2的幂的数的理解

n是一个整数,最近看一些文章说可以用"n&-n"得到n最低位的2的幂的数。

这个"n&-n"原理我花了很长时间才能理解,分享一下。

n的二进制表示的最低位的1,业界叫lowBit,只要的到这个1,那么便能得到这个数。

假设一个数的二进制表示为:
1 1 0
期望的到的结果
0 1 0

其中 1 是我们期望的到的lowBit

步骤一: 消除比lowBit高位的任何数

  • 手段是取反后和原来的数做&操作
    • 对110 取反是001 ,和原来的数做&操作,那么可以将比lowBit高位的任何数清理掉
  • 但是也会把lowBit跟比lowBit低位的数清理掉,所以要第二步。

步骤二: 消除比lowBit低位的0

  • 手段是在#1的取反后加1,再与原来的数做&操作
    • 对110 取反再加1是010
    • 这里关注看比lowBit低位的0,比lowBit低位如果存在0,那么必然会被加1操作导致“进1”(满2进1的进1),进的“1”刚好lowbit的位置上。
  • 用这个数去跟原来的数做&操作,既满足了#1的诉求,又能满足#2的诉求,达到最终的效果。

这两步就是补码,就是“-n”这个不解释。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值