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?


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.