pax*_*blo 44
它计算出n
是0还是2的精确幂.
它的工作原理是因为二进制幂的形式1000...000
和减去一个会给你111...111
.然后,当你和那些在一起时,你会得到零,例如:
1000 0000 0000 0000
& 111 1111 1111 1111
==== ==== ==== ====
= 0000 0000 0000 0000
Run Code Online (Sandbox Code Playgroud)
执行该操作时,任何非二次幂输入值(零除外)都不会为零.
例如,让我们尝试所有的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
Run Code Online (Sandbox Code Playgroud)
你可以看到,只有0
和两个(权力1
,2
,4
和8
)导致0000/false
的位模式,其他均为非零和true
.
如果 n 是 2 的幂,则返回 0(注意:仅适用于n > 0
)。因此,您可以像这样测试 2 的幂:
bool isPowerOfTwo(int n)
{
return (n > 0) && ((n & (n - 1)) == 0);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
25284 次 |
最近记录: |