Operacje dotyczące pierwszeństwa i maski bitowej

94

Natknąłem się na (pozornie) bardzo dziwny przypadek.

Weź liczbę 2 ( 0b10) i zamaskuj ją za pomocą 1 ( 0b01)

Powinno to dać 0b00odpowiednik 0.

Jednak tutaj pojawia się pan Schrödinger:

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

Whisky. Tango. Fokstrot.

Nie jestem, co prawda, najostrzejszy, jeśli chodzi o operatory bitowe - więc może gdzieś strasznie się pomyliłem?

Jednak w Pythonie:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...więc?

Danny Kopping
źródło
Nie w PHP, ale w C, C ++ możesz po prostu napisać jakovar_dump(!(0b10 & 0b01))
Grijesh Chauhan
2
Coś dziwniejsze jednak: 0b0+1Zwraca 2w niektórych wersjach, z powodu błędu parsera.
Lily Chung

Odpowiedzi:

150

Robisz to:

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

Próbować:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);
Mateusz
źródło
6
Wydaje mi się, że PHP ma ogólnie pierwszeństwo operatorów stron.
Alvin Wong
23
Myślę, że dlatego NIGDY nie polegam na precyzji w żadnym języku. Co więcej, myślę, że nawiasy sprawiają, że kod jest bardziej czytelny. W skrajnych przypadkach możesz chcieć (ponownie) pogrupować i zamieścić krótkie komentarze.
Brak odpowiedzi
2
@AlvinWong Masz rację! Myślę, że rzadko kod wymaga wyrażenia warunkowego, na przykład 0b10 & (0b01 == 0)dlaczego ktoś miałby zastosować bitowe z tak, bez rodzaju informacji.
Grijesh Chauhan
4
Cóż, rozważ bardziej powszechny przykład: operator trójskładnikowy PHP ma go od tyłu, dzięki czemu różni się od wszystkich innych języków. Odniesienie: phpsadness
Alvin Wong,
5
To dlatego w C i C ++ ludzie mają ostrzeżenia dotyczące takich rzeczy.
PlasmaHH