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,因为在 x
和 y
.
上都没有设置位
在你的例子中,如果 x
为真并且 x & x1
的否定不是 0,它将 return 为真,因为 0 是一个虚假值。
我不完全确定在这个过程中会发生什么,结果会是什么。我从来没有遇到过在 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,因为在 x
和 y
.
在你的例子中,如果 x
为真并且 x & x1
的否定不是 0,它将 return 为真,因为 0 是一个虚假值。