C++ return bool with && in return statement - 需要说明

C++ return bool with && in return statement - need clarification

我不完全确定在这个过程中会发生什么,结果会是什么。我从来没有遇到过在 return 中使用 &&,尤其是在同一个 return 语句中使用过一个。

bool myfunction(unsigned int x) 
{
    return x && !(x & (x­ - 1));
}

我想澄清一下这里发生了什么以及为什么。我一直在四处寻找,但 msdn 已关闭,似乎无法找到有关此类 return.

的任何具体答案

这是它的意思:

  • 开头的x部分表示x != 0
  • (x & (x-1)) 部分表示“x 不是 2 的幂”(即为零或设置了不止一位)
  • !(x & (x-­1)) 表达式表示“x 是二的幂”

因此,整体表达意思是“x是2的正幂”。

要了解为什么 x & (x-1) 可以帮助您找到 2 的幂,请考虑设置了一位的数字与设置了两位或更多位的数字会发生什么。设置了一位的数字在递减时会产生如下所示的序列:

000100000..000 <== x
000011111..111 <== x-1

当您将按位和应用于这样的一对数字时,您会得到零,因为 x 中设置的唯一位现在为零,而 [=21 中设置的所有位=] 在 x.

中为零

当数字设置了两位或更多位时,模式将如下所示:

010100000..000 <== x
010011111..111 <== x-1

现在设置的最后一位将被清除,但它前面的所有位将保持设置为 1,当使用原始值 "AND"-ed 时产生非零模式x.

&& 是 and 逻辑运算符。如果左右表达式都为真,则 return 为真。 & 是 and 按位运算符。 Returns 在左右操作数上设置的位。

嗯,这需要进一步解释。

基本上,& 运算符查看单个字节。例如,考虑:

int x = 1; int y = 2;

在这种情况下,x 设置了 1 位(它是 1)并且 y 也设置了 1 位(二进制为 10、2)。 因此,x & y 会产生 01 & 10,因此会产生 0,因为在 xy.

上都没有设置位

在你的例子中,如果 x 为真并且 x & x1 的否定不是 0,它将 return 为真,因为 0 是一个虚假值。

参见:https://msdn.microsoft.com/en-us/library/17zwb64t.aspx