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”这个不解释。