按位运算求值

Evaluation with bitwise operation

本文关键字:运算      更新时间:2023-10-16

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

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

令我惊讶的是,当n = 6时,它的值为false。如果我把它改成

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

我得到正确的结果。

编辑:

我知道!=首先被评估,但我仍然看不出在n = 6的情况下结果是假的。5!=0为真那么6&true仍然是true,对吗?

在您原来使用的表达式中,首先执行(n-1) != 0,然后对其结果应用n &


乍一看可能不符合逻辑,但==!=具有比&|更高的优先级。

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

C和c++中的

运算符:对位运算符和等号运算符优先级

的批评

从概念上讲,操作符|&类似于+*,因此将它们放在低优先级不是很直观,并且会导致像您发布的问题。

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

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

  1. Parenthesization
  2. !
  3. 求幂
  4. 乘除
  5. 加减法
一个常见的陷阱是内部的 ( 导致整个平衡的改变。相同的概念,但是按位操作的优先级最低。