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?


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);

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.