n& (n-1)这个表达式做了什么?

时间:2011-01-13 09:09:40

标签: c

  

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

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

4 个答案:

答案 0 :(得分:43)

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

它的工作原理是因为2的二进制幂是1000...000的形式,减去1会给你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和2的权力(1248)会产生{{1} }位模式,所有其他都不为零或0000/false

答案 1 :(得分:4)

如果n是2的幂,则返回0(NB:仅适用于n > 0)。所以你可以像这样测试2的幂:

bool isPowerOfTwo(int n)
{
    return (n > 0) && ((n & (n - 1)) == 0);
}

答案 2 :(得分:3)

答案 3 :(得分:1)

这是一个数字与之前的数字之间的按位运算。唯一的方法是这个表达式可能是假的,如果n是2的幂,那么基本上你是在验证它是不是2的幂。