C ++中(n&(n-1))==0
和n&(n-1)==0
做什么(n
是整数)?
if ((n&(n-1))==0)
{
// do something
}
if (n&(n-1)==0)
{
// do something
}
答案 0 :(得分:9)
他们假设测试数字n
是否为2的幂(尽管第二个未能如评论中所述)。它基于一个简单的观察,即在二进制表示中2的幂是唯一的数字,只有一位设置为1
。如果从这样的数字中减去1
,则会得到一系列1
s。
示例(正面):
n = 32
而不是二进制表示
n = 100000
然后
n - 1 = 011111
因此,如果您使用n - 1 & n
,则会获得0
。
示例(否定):
n = 6
而不是二进制表示
n = 110
现在
n - 1 = 101
所以((n - 1) & n) == 100 > 0
。
请注意,正如@harold在评论中提到的那样,0
也将通过此测试。
答案 1 :(得分:5)
(n & (n - 1)) == 0
n & (n - 1)
取消设置n
的较低设置位
二进制文件:XXX10000
- > XXX00000
(n & (n - 1)) == 0
0
以及2
的所有权力。
n & (n - 1) == 0
n & (n - 1) == 0
相当于n & ((n - 1) == 0)
(由于操作符的优先级),因此n == 1
。
答案 2 :(得分:0)
正如Lukaszz Said所说,
检查数字n是否为2的幂。
说明: -
如果n = 3或任何其他不是2的幂的数字
(n = 3,So(n-1)= 2)
3: - 0000 0011 2: - 0000 0010
比AND操作: - 0000 0010
如果n = 2或任何其他数字是2的幂
(n = 2 so(n-1)= 1) 2: - 0000 0010 1: - 0000 0001
因此,如果数字是2的幂,它总是返回0.
答案 3 :(得分:0)
它用于检查两个的幂,如下所示:
bool isPowerOfTwo(int n) {
return!(n&n-1)*n>0;
}