# Rechtsverschiebung OHNE Vorzeichenerweiterung



## julchen81 (15. Nov 2011)

Hallo!

Ich weiß, was Linksverschiebung und Rechtsverschiebung (mit Vorzeichenerweiterung) ist und wie ich sie durchführe.
Also z.B. 8<<2 = 2 oder -8<<2 = -2 oder 8>>1 = 16

Aber was versteht man unter Rechtsverschiebung OHNE Vorzeichenerweiterung??

z.B. gilt 8>>>2 = 2
Es gilt aber -8>>>2 = 1073741822

Wer kann mir das bitte erklären?

VG, Julia


----------



## SlaterB (15. Nov 2011)

> 8<<2 = 2 oder -8<<2 = -2 oder 8>>1 = 16
da hast du ja überall << und >> vertauscht..

-8 ist 11111111111111111111111111111000 in Bitdarstellung,
bei >> wird, auf welche Weise auch immer, vorne 1 reingeschoben, dann wird es zur -2, 

bei >>> kommen vorne 0en rein und 00111111111111111111111111111110 ist nunmal 1073741822,
ganz vorne fehlt die 1, also nicht mehr negativ sondern eine riesige positive Zahl

du musst dir eben im Detail anschauen wie ints in Bits, in Binärdarstellung aussehen,
Integer.toBinaryString(-8) kann dabei helfen, lässt allerdings leider führende Nullen weg,
also selber ergänzen bis 32 Bit lang oder eben darauf achten


----------



## Michael... (15. Nov 2011)

julchen81 hat gesagt.:


> 8<<2 = 2 oder -8<<2 = -2 oder 8>>1 = 16


Das würde mich wundern ;-) hast hier wohl die Richtung verwechselt.

In Java sind Zahlen vorzeichenbehaften und werden im Zweierkomplement dargestellt. Heist das höchste Bit eines int legt fest, ob die Zahl positiv oder negativ (erstes Bit gesetzt). Bei negativen Zahlen werden die restlichen 31 Bit negiert und eine eins dazu addiert.
d.h. während
8 intern als 0000...001000 gespeichert wird
wird -8 intern als 1111...111000 gespeichert.

Bei einer Bitverschiebung ohne Vorzeichenerweiterung wird nicht darauf geachtet, ob die Zahl positiv oder negativ ist. Es werden einfach die Bits im Speicher verschoben.
somit wird bei -8>>>2 oben dargestelltes Bitmuster zu 0011...111110 was nun eine positive Zahl darstellt.


----------

