2009-12-29 10 views
5

Wenn die verschobene Zahl positiv ist >>> und >> funktionieren gleich.Unterschied zwischen >>> und >> Operatoren

Wenn die verschobene Zahl negativ >>> füllt die höchstwertigen Bits mit 1s während >> Betrieb verschiebt die MSBs mit 0

Füllung Ist mein Verständnis richtig?

Wenn die negativen Zahlen mit dem auf 1 gesetzten MSB gespeichert werden und nicht die 2s-Komplementärweise, die Java verwendet, würden sich die Operatoren ganz anders verhalten, richtig?

+0

Mögliche Duplikate: [Unterschied zwischen >>> und >>] (http://stackoverflow.com/q/2811319/1529630), [Javas >> versus >>> Operator?] (http://stackoverflow.com/q/1034640/1529630) – Oriol

Antwort

8

Die Art und Weise, wie negative Zahlen dargestellt werden, wird als Zweierkomplement bezeichnet. Um zu zeigen, wie das funktioniert, nehmen Sie als Beispiel -12. 12, binär, ist 00001100 (angenommen, ganze Zahlen sind 8 Bits, obwohl sie in Wirklichkeit viel größer sind). Nehmen Sie das Zweierkomplement, indem Sie einfach jedes Bit invertieren, und Sie erhalten 11110011. Dann fügen Sie einfach 1 hinzu, um 11110100 zu erhalten. Beachten Sie, dass Sie, wenn Sie dieselben Schritte erneut anwenden, positive 12 zurückbekommen.

Die >>> verschiebt in Null egal was, also 12 >>> 1 sollte dir 00000110 geben, was 6 ist, und (-12) >>> 1 sollte dir 01111010 geben, was 122 ist. Wenn du Versuchen Sie dies tatsächlich in Java, Sie erhalten eine viel größere Zahl, da Java-Ints tatsächlich viel größer als 8 Bits sind.

Der >> verschiebt sich in ein Bit identisch mit dem höchsten Bit, so dass positive Zahlen positiv bleiben und negative Zahlen negativ bleiben. 12 >> 1 ist 00000110 (noch 6) und (-12) >> 1 wäre 11111010, was negativ ist 6.

1

genau das Gegenteil, füllt sich die >>> mit Nullen mit Einsen, während >> füllt, wenn die Ho-Bit ist 1.

+0

Können Sie erklären, warum '7 >>> 32 = 7'. Ich habe von kreisförmigen Verschiebungen gehört, aber ich dachte, dass das nur für '>>' gilt. Wäre nicht "7 >>> 32" nach 32 Verschiebungen gleich null? –

+0

@IanLimarta: Wenn die linke Seite ein int ist, wird der Verschiebungsbetrag mod 32 reduziert. In Ihrem Fall bedeutet das, dass der Verschiebungsbetrag 0 ist, was effektiv ein No-Op ist. Siehe [die JLS] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.19) –

2

Definition of the >>> operator in the Java Language Specification:

Der Wert von n ist n>>>s rechts verschoben s Bitpositionen mit Nullverlängerung. Wenn n positiv ist, ist das Ergebnis dasselbe wie das von n>>s; Wenn n negativ ist, ist das Ergebnis gleich dem des Ausdrucks (n>>s)+(2<<~s), wenn der Typ des linken Operanden int ist, und zum Ergebnis des Ausdrucks (n>>s)+(2L<<~s), wenn der Typ des linken Operanden long ist.