繁体   English   中英

(n&(n-1))== 0和n&(n-1)== 0在C ++中做什么?

[英]What do (n&(n-1))==0 and n&(n-1)==0 do in C++?

在C ++中(n&(n-1))==0n&(n-1)==0n是整数)会做什么?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM