先决和位掩码操作

94

我遇到了一个(看起来)非常奇怪的情况。

将数字2(0b10)与1(0b01)进行按位掩码运算。

这应该会产生等于0的0b00

然而,这里就有一个薛定谔先生的问题:

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
2
不过有更奇怪的是,在某些版本中,0b0+1 会评估为 2,这是由于解析器错误导致的。 - Lily Chung
1个回答

150

你实际上正在做这件事:

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

尝试:

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

6
对我来说,PHP 的运算符优先级总体上看起来很奇怪。 - Alvin Wong
23
我猜这就是为什么我在任何语言中都从不依赖于优先级。此外,我认为括号可以使代码更易读。在极端情况下,您可能需要重新分组并用短注释注明内容。 - No answer
2
@AlvinWong 没错!我认为很少有代码需要像 0b10 & (0b01 == 0) 这样的条件表达式,为什么会有人将按位运算应用于是非信息呢。 - Grijesh Chauhan
4
考虑一个更常见的例子:三元运算符,在 PHP 中它的顺序与所有其他语言不同,这使得 PHP 有些令人沮丧。参考来源:phpsadness。 - Alvin Wong
5
因此,在C和C++中,人们会对这些事情进行警告。 - PlasmaHH
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接