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

时间:2014-01-20 12:31:23

标签: c++ bit-manipulation

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

if ((n&(n-1))==0)
{
    // do something
}

if (n&(n-1)==0)
{
    // do something
}

4 个答案:

答案 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

比AND操作: - 0000 0000

因此,如果数字是2的幂,它总是返回0.

答案 3 :(得分:0)

它用于检查两个的幂,如下所示:

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