Right und Left Schicht funktionieren auf die gleiche Weise hier ist wie Right Shift funktioniert; Die rechte Verschiebung: Der Operator für die rechte Verschiebung, >>, verschiebt alle Bits in einem Wert eine bestimmte Anzahl von Malen nach rechts. Seine allgemeine Form:
Hier gibt num die Anzahl der Positionen an, um den Wert in Wert zu verschieben. Das heißt, das >> verschiebt alle Bits in dem angegebenen Wert nach rechts um die Anzahl der Bitpositionen, die durch num spezifiziert sind. Das folgende Codefragment verschiebt den Wert 32 nach rechts um zwei Positionen, die sich in einem bis 8 eingestellt wird:
int a = 32;
a = a >> 2; // a now contains 8
Wenn ein Wert Bits, die „verschoben off“, jene Bits verloren gehen. Beispielsweise verschiebt sich das nächste Codefragment den Wert 35 an den rechten zwei Positionen, die die zwei Bits niedriger Ordnung bewirkt verloren werden, was wiederum in einer zu 8.
int a = 35;
a = a >> 2; // a still contains 8
Mit Blick auf die gleiche Betrieb gesetzt wird, in binären zeigt deutlicher, wie dies geschieht:
00100011 35 >> 2
00001000 8
Jedesmal, wenn Sie einen Wert nach rechts verschieben, teilt sie diesen Wert von zwei und verwirft jeden Rest. Sie können dies für die Hochleistungs-Ganzzahl-Division durch 2 nutzen. Natürlich müssen Sie sicher sein, dass Sie keine Bits vom rechten Ende verschieben. Wenn Sie nach rechts verschieben, werden die oberen (am weitesten links liegenden) Bits, die von der rechten Verschiebung freigelegt wurden, mit dem vorherigen Inhalt des oberen Bits gefüllt. Dies wird als Zeichenerweiterung bezeichnet und dient dazu, das Vorzeichen negativer Zahlen zu erhalten, wenn Sie sie nach rechts verschieben. Zum Beispiel –8 >> 1
ist –4
, die in binärer ist
11111000 –8 >>1
11111100 –4
Es ist interessant zu bemerken, dass, wenn Sie verschieben -1 rechts, bleibt das Ergebnis immer -1, da hält Vorzeichenerweiterung in mehr Einsen in die bringen höherwertige Bits. Manchmal ist es nicht wünschenswert, Werte zu signieren, wenn Sie sie nach rechts verschieben. Beispielsweise konvertiert das folgende Programm einen Byte-Wert in seine hexadezimale Zeichenfolgendarstellung.Beachten Sie, dass der verschobene Wert maskiert wird, indem Sie ihn mit 0x0f UND-verknüpft werden, um alle Zeichenerweiterungsbits zu verwerfen, sodass der Wert als Index in das Array von Hexadezimalzeichen verwendet werden kann.
// Masking sign extension.
class HexByte {
static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" + hex[(b >> 4) & 0x0f] + hex[b & 0x0f]);
}
}
Hier ist die Ausgabe dieses Programms:
b = 0xf1
Linksverschiebung ist das gleiche wie mit 2 multipliziert, während Verschiebung nach rechts durch integer divide 2. ist – m0skit0