優先順位とビットマスク操作


94

(一見)非常に奇妙なケースに遭遇しました。

数2の(テイク0b10()と1とそれをビットマスク0b01

これは0b000に相当するものを生成するはずです。

ただし、ここでシュレーディンガー氏が登場します。

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

ウィスキー。タンゴ。Foxtrot。

確かに、ビット単位の演算子に関しては、私は最も鋭敏ではありません。恐らくどこかに恐ろしく、恐ろしく間違っているのでしょうか。

ただし、Pythonでは:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...そう?


私はPHPではありませんが、C、C ++では次のように書くことができますvar_dump(!(0b10 & 0b01))
Grijesh Chauhan

2
奇妙なもの:パーサーのバグのため、一部のバージョンではと0b0+1評価さ2れます。
リリーチョン

回答:


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
私はなぜだと思うNEVER任意の言語でも優先に依存していません。さらに、括弧を使用するとコードが読みやすくなります。極端なケースでは、グループ化(再)したり、コメントを短くしたりすることができます。
回答なし

2
@AlvinWongあなたは正しいです!私は、コードが条件付き式を必要とすることはまれだと思います0b10 & (0b01 == 0)
Grijesh Chauhan 2014

4
まあ、より一般的な例を考えてみましょう:三項演算子であるPHPは、それを後方に持っているため、他のすべての言語とは異なります。参照:phpsadness
Alvin Wong、

5
そのため、CおよびC ++では、これらの警告が出されます。
PlasmaHH 2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.