Diutamakan dan operasi bitmask

94

Saya telah menemukan kasus (yang tampaknya) sangat aneh.

Ambil angka 2 ( 0b10) dan bitmask dengan 1 ( 0b01)

Ini harus menghasilkan 0b00yang setara dengan 0.

Namun, di sinilah Tuan Schrödinger berperan:

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

Wiski. Tango. Foxtrot.

Saya, memang, bukan yang paling tajam dalam hal operator bitwise - jadi mungkin saya telah melakukan kesalahan yang sangat, sangat buruk di suatu tempat?

Namun, dengan Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...begitu?

Danny Kopping
sumber
Saya tidak di PHP tetapi di C, C ++ Anda cukup menulis sebagaivar_dump(!(0b10 & 0b01))
Grijesh Chauhan
2
Sesuatu yang lebih aneh: 0b0+1mengevaluasi 2di beberapa versi, karena bug parser.
Lily Chung

Jawaban:

150

Anda sebenarnya melakukan ini:

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

Mencoba:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);
Matthew
sumber
6
Tampak bagi saya bahwa PHP memiliki prioritas operator strnage secara keseluruhan.
Alvin Wong
23
Saya rasa itulah mengapa saya TIDAK PERNAH mengandalkan keunggulan dalam bahasa apa pun. Selain itu, menurut saya tanda kurung membuat kode lebih mudah dibaca. Dalam kasus ekstrim, Anda mungkin ingin mengelompokkan (kembali) dan memberi komentar pendek.
Tidak ada jawaban
2
@AlvinWong Anda benar! Saya pikir jarang kode membutuhkan ekspresi bersyarat seperti 0b10 & (0b01 == 0)mengapa seseorang menerapkan bitwise dengan ya tidak ada jenis informasi.
Grijesh Chauhan
4
Pertimbangkan contoh yang lebih umum: operator terner, PHP memilikinya mundur, membuatnya berbeda dari semua bahasa lainnya. Ref: phpsadness
Alvin Wong
5
Itu sebabnya di C dan C ++ orang memiliki peringatan untuk hal-hal ini.
PlasmaHH