按位计算AND来计算除以'n'的最大幂2 - C ++

时间:2018-05-26 12:39:46

标签: c++11 bitwise-operators

在读取二进制索引树的同时,我遇到了以下表达式,该表达式神奇地计算了除以给定数字'n'的最大二次幂

  

n&-n

我想要一个正式的论点,为什么这个表达式正在做它的作用。 此外,有许多这样的技巧使用按位运算符可能会节省我们很多时间并派上用场。请列出您知道的数量。
例如, 1 << n 提升了两个权力n。

1 个答案:

答案 0 :(得分:1)

回答我自己的问题, 我无法找到一个非常复杂的解决方案,但这让我很满意 让n除以2的最高幂为2 k 这意味着在最后1之后有k个零(如果没有,则给出n = 0,n&amp; -n也为零,这是正确的)。

  

-n = ~n+1,因此除了最后一个和以下k零之外,n中的所有数字都被反转。

取Bitwise AND将导致最后一个跟随k个零,恰好是2 k
我发现的一些使用按位运算符的黑客是:

  

x | (1 <&lt;&lt; k)将第k位设置为1

     

x&amp; 〜(1 <&lt;&lt; k)将第k位设为零

     

x ^(1      

x&amp; (x-1)将x的最后一位设置为零

     

x&amp; -x将所有的一位设置为零,除了最后一位。

     当p和x时,正数x是2的幂。 (x-1)= 0。

     

公式x | (x-1)将最后一位之后的所有位反转

这些可以通过类似的证明来证明。当我遇到更多时,我会添加更多。