【问题标题】:Difference between !(n & 1) and n & 1 == 0 in C++C++ 中 !(n & 1) 和 n & 1 == 0 之间的区别
【发布时间】: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


【解决方案1】:
  • if(!(n & 1)) 将评估为 true如果n 的最低有效位是1.

  • if(n & 1 == 0) 等价于if(n & (1 == 0)),会变成if (n & 0),也就是总是false.

查看operator precedence table,您会看到==& 之前。

【讨论】:

    【解决方案2】:

    因为运算符优先级。 n & 1 == 0 被解析为 n & (1 == 0),而不是 (n & 1) == 0

    【讨论】:

    • 关于运算符优先级和括号,还要注意!(n & 1) 将不同于!n & 1
    【解决方案3】:

    通常 (n&1),如果我们假设 n 是整数示例 2,那么首先它将转换为 32 位整数,因此 2= 00000000000000000000000000000010 而另一方面 1=000000000000000000000000000000001 现在我们应用“&”运算符返回 0(你可以简单地做一个二进制乘法)。现在,如果我们以 3=000000000000000000000000000000011 为例,这里的输出将为 1。

    所以基本上我们使用 n&1 来检查最后一位是否设置。 (你也可以说这个数字是偶数或奇数)

    现在在你的问题中, 1.if(!(n & 1)) :这里首先 n&1 将执行并且返回的值将逻辑非。

    1. if(n & 1 == 0) :为此,我们需要知道“==”首先执行,然后“&”将执行,因为运算符优先级。所以这里 (1==0) 返回 a 0 bcz 两个整数不相等,然后我们将执行 n&0,如果我们将任何内容与 0 相乘,我们都不会,那么它将返回 0,因此它将始终返回 false。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-04
      • 2021-03-19
      • 2018-04-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-20
      • 2014-08-30
      • 1970-01-01
      相关资源
      最近更新 更多