C ++返回bool与&&作为回报 - 需要澄清

时间:2015-02-26 20:03:30

标签: c++ return bit-manipulation ampersand

我不完全确定这个过程会发生什么,结果如何。我从来没有遇到过&& amp;在同一回报陈述中的回报或特别是单一回报。

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

我喜欢澄清这里发生的事情以及原因。我一直在四处寻找,但msdn已经关闭,似乎无法找到关于此类回报的具体答案。

2 个答案:

答案 0 :(得分:4)

这就是它的含义:

  • 最初的x部分表示x != 0
  • (x & (x-1))部分意味着" x不是2的力量" (即为零或设置多于一位)
  • !(x & (x-­1))表达意味着" x是2的力量"

因此,整体表达意味着" x是2的正面力量。

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

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

当你按位并且应用一对这样的数字时,得到零,因为x中设置的唯一位现在为零,并且x-1中设置了所有位在x中为零。

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

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

现在设置的最后一位将被清除,但它前面的所有位将保持设置为1,当&#34; AND&#34; -ed与原始位置时产生非零模式价值x

答案 1 :(得分:1)

&amp;&amp;是and逻辑运算符。如果左表达式和右表达式都为真,则返回true。 &amp;是and按位运算符。返回在左右操作数上设置的位。

嗯,这需要进一步解释。

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

int x = 1; int y = 2;

在这种情况下,x有1位设置(它是,1,好),y也有1位设置(它是10,二进制2)。 因此,x & y会产生01 & 10,因此会产生0,因为xy都没有设置位。

在你的情况下,如果x为真,它将返回true并且x & x1的否定不是0,因为0是一个假值。

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