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.