93

Ich bin auf einen (scheinbar) sehr seltsamen Fall gestoßen.Vorrang- und Bitmaskenoperationen

Nehmen Sie die Nummer 2 (0b10) und Bitmaske mit 1 (0b01)

Diese 0b00 produzieren sollte, die jedoch auf 0

entspricht, ist hier, wo Herr Schrödinger kommt:

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 irgendwo schrecklich, schrecklich falsch gelegen?

jedoch in Python:

0b10 & 0b01 == 0 = True

0b10 & 0b01 != 0 = False

... so?

+0

ich nicht in PHP, aber in C, C++ Sie einfach als 'Var_dump schreiben konnte ((0b10 & 0b01)) ' –

+2

Etwas seltsamer aber:' 0b0 + 1' ergibt in einigen Versionen aufgrund eines Parser-Fehlers '2'. – ikdc

Antwort

150

Du dies tatsächlich tun:

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

Try:

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

Scheint mir, dass PHP Operator Priorität insgesamt hat. –

+23

Ich schätze, deshalb setze ich ** NIEMALS auf Präzedenz in irgendeiner Sprache. Außerdem glaube ich, dass Klammern den Code lesbarer machen. Im Extremfall möchten Sie vielleicht Dinge neu gruppieren und kurz kommentieren. –

+2

@AlvinWong Sie sind richtig! Ich denke, dass selten ein Code einen bedingten Ausdruck wie '0b10 & (0b01 == 0) braucht. Warum sollte jemand bitweise mit ja, keine Art von Information anwenden. –