2016-07-31 32 views
-1

Kann mir bitte jemand erklären, warum dies 32 entspricht?PHP/bitwise Operatoren links shift

$a = 4 << 2 + 1; 
echo $a; 

Ausgang:

las ich die manual und fand heraus, dass << ist eine Bit-Verschiebung nach links, aber immer noch nicht ganz das Konzept begreifen.

+0

Siehe: http://stackoverflow.com/q/3737139/3933332 und http://php.net/manual/en/language.operators.precedence.php – Rizier123

+1

Das ist das gleiche wie '(4 << (2 + 1)) ': [https://eval.in/614829](https://eval.in/614829). – FirstOne

+0

Bitte posten Sie die Antwort nicht als Bearbeitung in der Frage;). Ich habe eine Antwort für Sie gepostet ^^ (Ich werde diesen Kommentar bald entfernen) – FirstOne

Antwort

2

Wenn wir das Problem in Schritte unterteilen, wird es einfach zu folgen. Ich werde zuerst den bitweisen Teil erklären, damit jeder, der diese Frage erreicht, den Punkt bekommt. Am Ende sehen Sie eine Erwähnung Ihres Problems.


Start:

$v = 4; 

Zuerst prüfen wir, wie viele Bits für diesen Wert benötigt.

echo decbin($v); // 3 bits (100) 

Dann verließen wir es durch zwei verschieben:

echo $v << 2; // the value is now 16. Why? 

denn wenn wir überprüfen die Bits:

echo decbin($v << 2); // 5 bits (10000) -> the previous 3 bits + 2 shifted 
//         /\ check that there are more 2 bits now 


Aber wir bekommen 32 als Ergebnis , Warum das? Nun, weil in diesem Fall + zuerst kommt. Es wertet zunächst die Summe (2 + 1) aus und verschiebt erst dann. Ihr Code ist der gleiche wie 4 << (2 + 1).

Wenn wir die Schritte genau wie vorher überprüfen, aber wissend wird es zuerst summieren, wird es tatsächlich um 3 scheißen, so dass der letzte Wert 6 Bits stattdessen haben. Wenn wir den um 3 (100000) verschobenen Wert umrechnen, erhalten wir 32.