n & (n-1) 这个表达式是做啥的? [复制]

Posted

技术标签:

【中文标题】n & (n-1) 这个表达式是做啥的? [复制]【英文标题】:n & (n-1) what does this expression do? [duplicate]n & (n-1) 这个表达式是做什么的? [复制] 【发布时间】:2011-01-13 09:09:39 【问题描述】:

可能的重复:Query about working out whether number is a power of 2What does this function do?

n & (n-1) - 这个表达式可以用在哪里?

【问题讨论】:

检查这个问题:***.com/questions/3265942/what-does-this-function-do/… @Paul R,对我来说,这不是重复的(尽管相关)——有人可能会说,这个来自另一种方式。 它将最右边的1变成n的二进制模式的0。如果结果为 0,则表示 n 的二进制模式中只有一个 1,即 n 是 2 的幂。 【参考方案1】:

它正在确定n 是 0 还是 2 的精确幂。

之所以有效,是因为 2 的二进制幂是 1000...000 的形式,减去一个将得到 111...111。然后,当你将它们加在一起时,你会得到零,例如:

  1000 0000 0000 0000
&  111 1111 1111 1111
  ==== ==== ==== ====
= 0000 0000 0000 0000

当您执行该操作时,任何非二次幂输入值(零以外)不会给您零。

例如,让我们尝试所有 4 位组合:

     <----- binary ---->
 n      n    n-1   n&(n-1)
--   ----   ----   -------
 0   0000   0111    0000 *
 1   0001   0000    0000 *
 2   0010   0001    0000 *
 3   0011   0010    0010
 4   0100   0011    0000 *
 5   0101   0100    0100
 6   0110   0101    0100
 7   0111   0110    0110
 8   1000   0111    0000 *
 9   1001   1000    1000
10   1010   1001    1000
11   1011   1010    1010
12   1100   1011    1000
13   1101   1100    1100
14   1110   1101    1100
15   1111   1110    1110

您可以看到只有0 和两个的幂(1248)导致0000/false 位模式,所有其他都是非零或@ 987654333@.

【讨论】:

怎么7和-1都有0111? n &amp; (n-1) 有助于识别最后一位的值。由于 n 和 n-1 的最低有效位是 (0 and 1) 或 (1 and 0) 。参考上表。 (n &amp; (n-1)) == 0 只检查 n 是 2 还是 0 的幂。 问题来自leetcode【参考方案2】:

如果 n 是 2 的幂,则返回 0(注意:仅适用于 n &gt; 0)。因此,您可以像这样测试 2 的幂:

bool isPowerOfTwo(int n)

    return (n > 0) && ((n & (n - 1)) == 0);

【讨论】:

【参考方案3】:

它检查 n 是否是 2 的幂:What does the bitwise code "$n & ($n - 1)" do?

【讨论】:

【参考方案4】:

这是一个数字与其前一个数字之间的按位运算。只有当 n 是 2 的幂时,这个表达式才会为假,所以本质上你是在验证它是否不是 2 的幂。

【讨论】:

以上是关于n & (n-1) 这个表达式是做啥的? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

-> <- 运算符是做啥的?

CSS:这个星号 (*) 是做啥的?

这个宏定义是做啥的?

这个 HTTP Authorization RewriteRule 是做啥的?

~> 运算符是做啥的? [复制]

这个使用 PHP $$ 语法的循环是做啥的?