【发布时间】:2022-05-04 00:32:11
【问题描述】:
由于某些原因,在 C++ 中,表达式 if(!(n & 1)) 和 if(n & 1 == 0) 似乎不等价。
有人可以解释为什么会这样吗?
-
尝试
if((n & 1) == 0)而不是if (n & 1 == 0)。
标签: c++ bit-manipulation bitwise-operators bit bitwise-and
由于某些原因,在 C++ 中,表达式 if(!(n & 1)) 和 if(n & 1 == 0) 似乎不等价。
有人可以解释为什么会这样吗?
if((n & 1) == 0) 而不是if (n & 1 == 0)。
标签: c++ bit-manipulation bitwise-operators bit bitwise-and
if(!(n & 1)) 将评估为 true如果n 的最低有效位是1.
if(n & 1 == 0) 等价于if(n & (1 == 0)),会变成if (n & 0),也就是总是false.
查看operator precedence table,您会看到== 在& 之前。
【讨论】:
因为运算符优先级。 n & 1 == 0 被解析为 n & (1 == 0),而不是 (n & 1) == 0。
【讨论】:
!(n & 1) 将不同于!n & 1。
通常 (n&1),如果我们假设 n 是整数示例 2,那么首先它将转换为 32 位整数,因此 2= 00000000000000000000000000000010 而另一方面 1=000000000000000000000000000000001 现在我们应用“&”运算符返回 0(你可以简单地做一个二进制乘法)。现在,如果我们以 3=000000000000000000000000000000011 为例,这里的输出将为 1。
所以基本上我们使用 n&1 来检查最后一位是否设置。 (你也可以说这个数字是偶数或奇数)
现在在你的问题中, 1.if(!(n & 1)) :这里首先 n&1 将执行并且返回的值将逻辑非。
【讨论】: