Was ist der Unterschied zwischen >>>
y >>
Operatoren in Java?
Antworten
Zu viele Anzeigen?>>
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
.
>>>
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
esn
rechtsgeschaltets
Bitpositionen mit Vorzeichenerweiterung .Der Wert von
n>>>s
esn
rechtsgeschaltets
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
- Rechte Umschalttaste zum Dividieren durch 2 auf -1
- Ist das Verschieben von Bits schneller als Multiplizieren und Dividieren in Java? .NET?
- Wie kann man in C/C++ '>>>' wie in Java machen (Rechtsverschiebung ohne Vorzeichen)?
- Negative logische Verschiebung
- Javas >> versus >>> Operator?
- Was ist der Unterschied zwischen den Java-Operatoren >> und >>>?
- Unterschied zwischen >>> und >> Operatoren
- Was ist der Grund dafür, dass Hochsprachen wie C#/Java den Bit-Shift-Count-Operanden maskieren?
1 >>> 32 == 1
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.
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.
- See previous answers
- Weitere Antworten anzeigen