按位运算评估

时间:2015-08-30 07:14:52

标签: c++ bitwise-operators

当检查n是否是2的指数时,我写了以下这一行:

if(n&(n-1)!=0)
令我惊讶的是,当n为6时,这被评估为假。然后,如果我将其更改为

if((n&(n-1))!=0)

我得到了正确的结果。

编辑:

我认为首先评估!=,但在n = 6的情况下我仍然不知道结果是如何错误的。 5!= 0是真的 然后6& true应该仍然是真的吗?

2 个答案:

答案 0 :(得分:1)

在您最初使用的表达式中,首先执行(n-1) != 0,然后将n &应用于其结果。

乍一看,它可能看起来不合逻辑,但==!=的优先级高于&|

这是一种常见的C / C ++行为,它的批评已经解决了这个问题:

Operators in C and C++: Criticism of bitwise and equality operators precedence

从概念上讲,运营商|&就像+*一样,因此优先级较低并不是非常直观,会导致您发布的问题

提示:与任何编程语言联系时,最好养成在有疑问时检查运算符优先主题的习惯。实际上,你很快就会发现你实际上已经记住了它。

答案 1 :(得分:0)

我想说优先顺序在这里非常重要。从第二次尝试开始,结果是正确的,因为这称为运算符优先级(或"运算顺序")。普通运营商的优先级通常被定义为"更高级别"首先执行操作(即,高级操作"更紧密地绑定")/对于简单表达式,操作通常按顺序从最高到最低排序:

  1. 加括号
  2. 阶乘

  3. 乘法和除法
  4. 加法和减法
  5. 一个常见的陷阱是内部 ( 导致改变整体平衡。同样的概念,但是位操作具有最低优先级。