优先级和位掩码操作


94

我遇到了一个(看似)非常奇怪的案例。

取数字2(0b10)并用1(0b01)对其进行位掩码

这应产生0b00等于0的值。

但是,这里是薛定ding先生进来的地方:

var_dump(0b10 & 0b01); // int(0)
var_dump(0b10 & 0b01 == 0); // int(0)
var_dump(0b10 & 0b01 != 0); // int(0)

威士忌酒。探戈 狐步舞。

坦率地说,对于按位运算符,我不是最聪明的人-所以也许我在某个地方犯了可怕的错误?

但是,在Python中:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...所以?


我不在PHP中,但在C,C ++中,您可以简单地写为var_dump(!(0b10 & 0b01))
Grijesh Chauhan 2014年

2
不过有些奇怪:由于解析器错误,在某些版本中0b0+1评估为2
莉莉·钟

Answers:


150

您实际上是在这样做:

var_dump(0b10 & (0b01 == 0));
var_dump(0b10 & (0b01 != 0));

尝试:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);

6
在我看来,PHP总体上具有strnage运算符优先级。
Alvin Wong

23
我想这就是为什么我从不依赖任何语言的优势。而且,我认为括号使代码更易读。在极端的情况下,您可能需要对(重新)分组和简短评论的内容。
没有答案

2
@AlvinWong你是正确的!我认为代码很少需要条件表达式,例如0b10 & (0b01 == 0)为什么有人在没有任何信息的情况下按位应用。
Grijesh Chauhan 2014年

4
好吧,请考虑一个更常见的示例:三元运算符,PHP具有向后的功能,使其不同于所有其他语言。参考:phpsadness
Alvin Wong

5
这就是为什么在C和C ++中人们会对这些事情发出警告。
PlasmaHH 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.