Vorrang- und Bitmaskenoperationen

94

Ich bin auf einen (scheinbar) sehr seltsamen Fall gestoßen.

Nimm die Nummer 2 ( 0b10) und maskiere sie mit 1 ( 0b01)

Dies sollte ergeben, 0b00was 0 entspricht.

Hier kommt jedoch Herr Schrödinger ins Spiel:

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

Whiskey. Tango. Foxtrott.

Ich bin zugegebenermaßen nicht der Schärfste, wenn es um bitweise Operatoren geht - also habe ich mich vielleicht irgendwo schrecklich, schrecklich geirrt?

In Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

...so?

Danny Kopping
quelle
Ich nicht in PHP, aber in C, C ++ könnte man einfach schreiben alsvar_dump(!(0b10 & 0b01))
Grijesh Chauhan
2
Etwas seltsamer: Wird in einigen Versionen aufgrund eines Parser-Fehlers 0b0+1ausgewertet 2.
Lily Chung

Antworten:

150

Sie machen das tatsächlich:

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

Versuchen:

var_dump((0b10 & 0b01) == 0);
var_dump((0b10 & 0b01) != 0);
Matthew
quelle
6
Mir scheint, dass PHP insgesamt Vorrang vor Strnage-Operatoren hat.
Alvin Wong
23
Ich denke , das ist , warum ich nie in jeder Sprache auf precendence verlassen. Darüber hinaus denke ich, dass Klammern Code lesbarer machen. In extremen Fällen möchten Sie möglicherweise Inhalte (neu) gruppieren und kurz kommentieren.
Keine Antwort
2
@AlvinWong Du bist richtig! Ich denke, selten braucht ein Code einen bedingten Ausdruck, wie zum Beispiel, 0b10 & (0b01 == 0)warum jemand bitweise mit Ja-Nein-Informationen anwenden würde.
Grijesh Chauhan
4
Betrachten Sie ein häufigeres Beispiel: Der ternäre Operator PHP hat es rückwärts, wodurch es sich von allen anderen Sprachen unterscheidet. Ref: Phpsadness
Alvin Wong
5
Deshalb haben Leute in C und C ++ Warnungen für diese Dinge.
PlasmaHH