466 Stimmen

Unterschied zwischen >>> und >>

Was ist der Unterschied zwischen >>> y >> Operatoren in Java?

510voto

danben Punkte 77356

>> ist eine arithmetische Verschiebung nach rechts, >>> ist die logische Verschiebung nach rechts.

Bei einer arithmetischen Verschiebung wird das Vorzeichenbit erweitert, um die Vorzeichenhaftigkeit der Zahl zu erhalten.

Zum Beispiel: -2 in 8 Bits dargestellt wäre 11111110 (weil das höchstwertige Bit ein negatives Gewicht hat). Eine Verschiebung um ein Bit nach rechts mittels arithmetischer Verschiebung würde Folgendes ergeben 11111111 oder -1. Die logische Rechtsverschiebung kümmert sich jedoch nicht darum, dass der Wert möglicherweise eine vorzeichenbehaftete Zahl darstellen könnte; sie verschiebt einfach alles nach rechts und füllt von links mit 0en auf. Die Verschiebung unserer -2 um ein Bit nach rechts mit logischer Verschiebung würde ergeben 01111111 .

119voto

polygenelubricants Punkte 362173

>>> ist unsigned-shift; es wird 0 eingefügt. >> ist vorzeichenbehaftet und erweitert das Vorzeichenbit.

JLS 15.19 Schichtarbeiterinnen und Schichtarbeiter

Die Verschiebungsoperatoren umfassen Linksverschiebung << , vorzeichenbehaftete Rechtsverschiebung >> und Rechtsverschiebung ohne Vorzeichen >>> .

Der Wert von n>>s es n rechtsgeschaltet s Bitpositionen mit Vorzeichenerweiterung .

Der Wert von n>>>s es n rechtsgeschaltet s Bitpositionen mit Null-Extension .

    System.out.println(Integer.toBinaryString(-1));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >> 16));
    // prints "11111111111111111111111111111111"
    System.out.println(Integer.toBinaryString(-1 >>> 16));
    // prints "1111111111111111"

Zur Verdeutlichung: Hinzufügen des positiven Gegenstücks

System.out.println(Integer.toBinaryString(121));
// prints "1111001"
System.out.println(Integer.toBinaryString(121 >> 1));
// prints "111100"
System.out.println(Integer.toBinaryString(121 >>> 1));
// prints "111100"

Da es sich um einen positiven Wert handelt, addieren sowohl vorzeichenbehaftete als auch vorzeichenlose Verschiebungen 0 zu dem am weitesten links stehenden Bit.

Verwandte Fragen

55voto

corsiKa Punkte 79125

>>> setzt immer eine 0 in das am weitesten links stehende Bit, während >> setzt eine 1 oder eine 0, je nachdem, welches Vorzeichen es hat.

54voto

Matt Punkte 42232

Sie sind beide rechtsschaltend, aber >>> es unsigned

De la Dokumentation :

Der vorzeichenlose Rechtsschiebeoperator ">>>" verschiebt eine Null an die äußerste linke Stelle, während die äußerste linke Stelle nach ">>" von der Vorzeichenerweiterung abhängt.

46voto

andru Punkte 549

Die logische Rechtsverschiebung ( v >>> n ) gibt einen Wert zurück, bei dem die Bits in v sind nach rechts verschoben worden durch n Bitpositionen, und 0's werden von der linken Seite eingeschoben. Betrachten Sie die Verschiebung von 8-Bit-Werten, die binär geschrieben sind:

01111111 >>> 2 = 00011111
10000000 >>> 2 = 00100000

Wenn wir die Bits als vorzeichenlose nichtnegative ganze Zahl interpretieren, hat die logische Rechtsverschiebung den Effekt, dass die Zahl durch die entsprechende Potenz von 2 geteilt wird. Wenn die Zahl jedoch in Zweierkomplement-Darstellung vorliegt, werden negative Zahlen durch die logische Rechtsverschiebung nicht korrekt geteilt. Die zweite Rechtsverschiebung oben verschiebt beispielsweise 128 nach 32, wenn die Bits als vorzeichenlose Zahlen interpretiert werden. Sie verschiebt jedoch -128 zu 32, wenn, wie in Java üblich, die Bits im Zweierkomplement interpretiert werden.

Wenn Sie also eine Verschiebung vornehmen, um durch eine Zweierpotenz zu dividieren, müssen Sie die arithmetische Rechtsverschiebung ( v >> n ). Sie gibt einen Wert zurück, bei dem die Bits in v sind nach rechts verschoben worden durch n Bitpositionen, und Kopien von das ganz linke Bit von v werden von der linken Seite her eingeschoben:

01111111 >> 2 = 00011111
10000000 >> 2 = 11100000

Wenn die Bits eine Zahl in Zweierkomplement-Darstellung sind, hat die arithmetische Rechtsverschiebung die Wirkung einer Division durch eine Zweierpotenz. Dies funktioniert, weil das Bit ganz links das Vorzeichenbit ist. Bei der Division durch eine Zweierpotenz muss das Vorzeichen gleich bleiben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X