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

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

本文关键字:n-1 什么 C++      更新时间:2023-10-16

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

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

他们应该测试数字n是否是 2 的幂(尽管第二个没有这样做,如评论中所述)。它基于一个简单的观察,即在二进制表示中,2 的幂是唯一一个位设置为1的数字。如果你从这个数字中减去1,你会得到一个1s的序列。

示例(正面):

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
in 二进制的下限设置位:XXX10000->XXX00000

所以(n & (n - 1)) == 002的所有权力.

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

比 和 操作 :- 0000 0000

因此,如果数字是 2 的幂,则始终返回 0。

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

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