Binäre Schiebe-Operatoren

aus RHWiki, der freien Romhacking-Enzyklopädie

Die Schiebeoperatoren, auch shift-Operatoren genannt, bewirken ein 'Schieben' der Bits eines Wertes um eine bestimmte Anzahl von Stellen in eine bestimmte Richtung.

Da im Dualsystem (zur Basis 2) gerechnet wird, kann man die Schiebeoperationen mit Multiplikationen mit Potenzen der Zahl 2 vergleichen.

Fallen bei den Operationen Bits raus, so landen diese auf vielen Architekturen im Carry-Flag, von wo aus sie abgefragt und/oder weiterverarbeitet werden können.

Inhaltsverzeichnis

Operationen

Shl

"Zahl Shl Stellen" bzw. "Zahl << Stellen" (Logischer Linksshift)
Schiebt alle Bits einer Zahl um 'Stellen' Bits nach links. Rechts wird mit 0-en aufgefüllt. Der geshiftete Wert kann den Wertebereich der Zahl nicht überschreiten (siehe: Datentypen). Daher fallen links Bit raus. Das letzte 'rausgefallene' Bit bleibt auf vielen Architekturen noch im Carry-Flag erhalten.

Beispiele:

00010110 << 3 = 10110000 (8 Bit Werte)
01101001 << 3 = 01001000
0001101100101101 << 7 = 1001011010000000 (16 Bits)

Ein Linksshift um N Bits kommt einer Multiplikation mit 2^N ("2 hoch N") gleich.

Shr

"Zahl Shr Stellen" bzw. "Zahl >> Stellen" (Logischer Rechtsshift)
Arbeitet ähnlich wie Shl, nur dass die Bits nach rechts geschoben werden. Links wird mit 0-en aufgefüllt (im Gegensatz zu Arithmetic Shr). Bits die rechts rausfallen, werden in der Regel im Carry-Flag gespeichert, bis das Flag von anderen Werten überschrieben wird.

Beispiele:

01010000 >> 3 = 00001010 (8 Bit)
0110101111011001 >> 8 = 0000000001101011 (16 Bits)

Ein Rechtsshift einer vorzeichenlosen Zahl um N Bits kommt einer Division dieser Zahl durch 2^N ("2 hoch N") gleich. Für vorzeichenbehaftete Zahlen muss der Arithmetische Shr verwendet werden, da beim normalen Shr das Vorzeichen verloren gehen kann.

Arithmetischer Shr

"Zahl Sar Stellen" (x86) oder "Zahl Asr Stellen" (ARM) (Arithmetischer Rechtsshift)
Funktioniert wie ein normaler Shr, nur dass das linke Bit erhalten bleibt, also nicht mit 0 aufgefüllt wird. Es wird aber dennoch nach rechts verschoben, sodass man sich vorstellen kann, dass es kopiert wird.

Sinn dieses Shiftes ist es, das Vorzeichen negativer Zahlen zu erhalten. Bei Zahlen, die nur positiv sein können, spielt der Asr dagegen keine Rolle.

Beispiele:

01010111 Asr 3 = 00001010 (8 Bit; links ist 0, also bleibt links 0)
10111001 Asr 3 = 11110111 (8 Bit, die Linke 0 bleibt erhalten)
1101010001010001 Asr 9 = 1111111111101010 (16 Bit)

Ein Asr um N Bits kommt einer Division einer vorzeichenbehafteten Zahl durch 2^N ("2 hoch N") gleich. Das Vorzeichen bleibt erhalten und es kommt im Gegensatz zu Shr kein Müll raus.

Rol

"Zahl Rol Stellen" (x86) (Links Rollen bzw. Roll Left)
'Rollt' die Bits einer Zahl nach links, d.h. es funktioniert wie ein normaler Shl nur dass alle Bits die links rausfallen zum Auffüllen der rechten Seite verwendet werden (in der selben Reihenfolge).

Beispiele:

10011100 Rol 3 = 11100100 (8 Bit)
1011111101000010 Rol 8 = 0100001010111111 (16 Bit)

Auf einigen Architekturen gibt es auch (oder stattdessen) Befehle, die das rausfallende Bit erst in das Carry-Flag schreiben, während rechts mit dem Bit aus dem Carry-Flag aufgefüllt wird. Auf diese Weise wird das Carry-Flag praktisch in den Kreis miteinbezogen.

Beispiel:

01011000 cy=1 Scl 1 => 10101100 cy=0 (9 Bit, x86)

Ror

"Zahl Rol Stellen" (x86) (Rechts Rollen bzw. Roll Right)
Funktioniert wie Rol, nur dass nach rechts gerollt wird. Die rechts rausfallenden Bits werden links wieder aufgefüllt.

Beispiele:

01001011 Ror 4 = 10110100 (8 Bit)
1110110100111110 Ror 5 = 1111011101101001 (16 Bit)

Man verwendet Ror's oft um an die höheren (d.h. weiter links stehenden) Bits eines Wertes heranzukommen, ohne den Rest zu löschen, da auf vielen Architekturen Operationen mit den niedrigsten Bits optimiert sind.

Ein Ror um N Bits ist gleich einem Rol um -N ("Minus N") Bits. (Vor das '-' kann man die Größe des verwendeten Datentyps - z.B. 8 - setzen, falls es der Vorstellung hilft.) Umgekehrt gilt das gleiche.
Deshalb gibt es auf manchen Plattformen nur einen der beiden Befehle.

Wie bei Rol unterstützen einige Systeme das rechts-rollen durch das Carry-Flag. Auf dem x86 geht das z.B. mit Rcr.

Anwendungen

Die Bit-Schiebe-Operationen sind zunächst in vielen Prozessoren implementiert, weil mit ihnen einfach schneller Multiplikationen bzw. Divisionen mit Zweierpotenzen durchgeführt werden können (man kann sich vorstellen, dass ein Shift im Prozessor wesentlich einfacher implementiert ist, als ein Mul-Befehl).

Spezielle Anwendung finden diese Operationen vorallem in Komprimierungen und Bit-Streams / Bitfields (Datenstrukturen, bei denen Bit-genauer Zugriff notwendig ist). Durch Adressierung einzelner Bits im Gegensatz zu ganzen Bytes kann oft viel Speicher gespart werden.

Siehe auch

'Persönliche Werkzeuge