Operator >> und Operator >>>
-
Hi Leute!
Ich wundere mich darüber das es in Java anscheinend einen logischen und einen arithmetischen Shift gibt. >> = arithmetisch >>> = logisch ?
Mir fehlt da noch ein bissel die Vorstellungskraft
Könnte mir jemand ein Simples Beispiel zeigen wo beide verwendet werden ?
Außerdem warum gibt es keinen Operator <<< ???Danke für eure Hilfe
-
Die beiden unterscheiden sich bei negativen Zahlen. Logisches Rechts-Verschieben füllt die links freiwerdenden Stellen mit 0 auf. Das hat bei positiven Zahlen gleichzeitig die Bedeutung "Division durch 2". Macht man das aber bei negativen Zahlen, funktioniert das nicht mehr (u.a. weil das Vorzeichenbit 0 wird und damit die Zahl positiv).
Möchte man nicht simpel Bits verschieben und tatsächlich die Divisionseigenschaft ausnutzen, muß man an der Verschiebung nur ein Detail ändern: Man läßt von links nicht Nullen nachrutschen, sondern immer genau den Wert des höherwertigsten Bits. D.h. 10011010 würde um 1 nach rechts verschoben 11001101 werden, 00101001 dagegen 00010100. Das ist arithmetische Verschiebung.
Bei der Linksverschiebung existiert das Problem nicht. Sowohl bei negativen als auch bei positiven Zahlen bedeutet schieben um 1 eine Multiplikation mit 2. Jedenfalls solange der Wertebereich nicht überschritten wird.
-
Genau. Beim >>> Operator wird wird die 1. Stelle von links auf 0 gesetzt. Das ist aber nur bei int Zahlen so. Bei byte Variablen verhält sich >>> ganz genauso wie >>.
-
Anscheinend wird die byte-Variable vor der Anwendung des Operators in int konvertiert (promoted in C-speak).
byte b = -4; System.out.println(b >> 1); System.out.println(b >>> 1);
ergibt jedenfalls -2 und 2 Milliarden+x, d.h. die Rechnung wird auch bei byte in 32 Bit durchgeführt.