java Bitoperationen verschieben sich

8

Warum wenn

%Vor%

wir haben 00000000000000000000000000000001

aber wenn

%Vor%

wir haben 11111111111111111111111111111111 (wieder -1)

aber nicht 00000000000000000000000000000000?

    
ses 11.02.2013, 17:37
quelle

3 Antworten

13

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 Maskenwert 0x1f (0b11111) . Die tatsächlich genutzte Verschiebestrecke liegt daher immer in der   Bereich 0 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.

    
Rohit Jain 11.02.2013, 17:39
quelle
2

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.

    
Marko Topolnik 11.02.2013 17:39
quelle
0

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

    
sr33 16.06.2017 23:20
quelle

Tags und Links