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.


Anmelden zum Antworten