按位运算n&(n-1)是做什么的?

5

我正在尝试理解一些代码,其中我发现了以下语句:

n=n&(n-1);

这个做什么?

6
如果 x & (x - 1) 的结果为0,则表示 x 是2的幂。请参见此页面上的#9。 - meowgoesthedog
1
如果有人知道我可以在哪里学习这样的位操作技巧,请分享。谢谢。 - Piyush Soni
1
https://graphics.stanford.edu/~seander/bithacks.html - pm100
如果你喜欢位运算,那么有一本名为《Hacker's Delight》(第二版)的优秀书籍,作者是Henry Warren,你会发现它非常有趣。https://www.amazon.com/dp/0321842685 - Eljay
1个回答

14

那个方程使得n中最不重要的非零位变成零。

如果我们假设有8个二进制位,这里是简要解释。令n为70。

n       = 01000110
n-1     = 01000101
          --------
n&(n-1) = 01000100

因此,如果结果为0,则意味着最初n中只设置了一个位,这意味着它是2的幂(或者一开始就是0)。

如果在循环中反复应用,直到n变为0,则迭代次数计算n最初所设定的位数。但是,大多数处理器都将具有内置操作来完成此操作。


如果您对位运算感兴趣,请在本网站上搜索“bithacks”,会有很多相关信息。


1
这假设 n 是一个 unsigned 类型。它还将指示零是2的幂。 - Peter
@Peter:它似乎适用于二进制补码和原码。感谢指出关于0的问题。 - jxh
这就是所谓的“汉明重量”问题 :) - Ε Г И І И О

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接