[英]What do (n&(n-1))==0 and n&(n-1)==0 do in C++?
在C ++中(n&(n-1))==0
和n&(n-1)==0
( n
是整数)会做什么?
if ((n&(n-1))==0)
{
// do something
}
if (n&(n-1)==0)
{
// do something
}
他们假设要测试数字n
是否为2的幂(尽管第二个数字未能如注释中所述)。 根据一个简单的观察,在二进制表示形式中,只有2的幂是仅将1
设置为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
也将通过此测试。
(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
。
正如卢卡斯所说,
它检查数字n是否为2的幂。
说明:-
如果n = 3或其他不是2的幂的数字
(n = 3,所以(n-1)= 2)
3:-0000 0011 2:-0000 0010
比AND运算:-0000 0010
如果n = 2或任何其他为2的幂的数字
(n = 2所以(n-1)= 1)2:-0000 0010 1:-0000 0001
比AND运算:-0000 0000
因此,如果数字是2的幂,它将始终返回0。
用于检查两个的幂,如下所示:
bool isPowerOfTwo(int n) {
return!(n&n-1)*n>0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.