Aus Abschnitt 15.19 von JLS :
Wenn der promovierte Typ des linken Operanden int ist, dann nur die fünf Bits mit der niedrigsten Ordnung des rechten Operanden werden als die Verschiebung verwendet Entfernung . Es ist, als ob der rechte Operand einem bitweise logischer AND Operator
&
(§15.22.1) mit dem Maskenwert0x1f (0b11111)
. Die tatsächlich genutzte Verschiebestrecke liegt daher immer in der Bereich0 to 31
, inklusive.
Schwerpunkt meiner. Also:
%Vor%entspricht:
%Vor% Also ist x >>> 32
äquivalent zu x >>> 32 & 0x1f
& lt; == & gt; x >>> 0
== x
.
Also die Daumenregel ist, wenn Sie eine Zahl um ein Vielfaches von 32
( int
ist 32 bits
) verschieben, erhalten Sie die gleicher Wert.
Bei der Bit-Shift-Operation werden nur die untersten 5 Bits des rechten Operanden berücksichtigt. Seit 32 === 0 // mod 32 ist das Ergebnis keine Verschiebung.
Verbrachte einen ganzen Tag damit, mir den Kopf darüber zu brechen, warum ein langes l = i & lt; & lt; 32 benahm sich seltsam, schrieb dann einige grundlegende Tests, hatte den WTF-Moment und änderte dann zu lange l = (lang) i & lt; & lt; 32 damit es funktioniert.
Meine einzige Ergänzung zu Rohits Antwort ist der Grund, warum das so ist. Von IA-32 Intel Architecture Software Entwicklerhandbuch 3:
Der 8086 maskiert die Anzahl der Verschiebungen nicht. Aber auch alle anderen IA-32-Prozessoren (mit dem Prozessor Intel 286 beginnend) tun, um die Schiebezahl auf 5 Bits maskieren, in einer maximalen Anzahl der 31 resultierenden Diese Maskierung in allen Betriebsarten erfolgt (einschließlich der virtuellen 8086-Modus) Reduziere die maximale Ausführungszeit der Anweisungen