Im Kommentar zu Carry Bit: How does it work ist nach den Shift- und Rotationsfunktionen gefragt worden. Welche es genau gibt, hängt natürlich von der Prozessorarchitektur ab, aber grundsätzlich muss man die folgenden Aspekte beachten:
- 8, 16, 32, 64,… Bit: Wieviele Bits sind von der Operation betroffen?
- Shift vs. Rotate: Beim Shift werden an einer Seite Bits als 0 oder 1 ergänzt und auf der anderen Seite wandern sie in das Carry-Bit, beim Rotieren werden Bits im Kreis rotiert, die herausfallenden Bits vom einen Ende werden am anderen Ende wieder eingefügt.
- ROL und ROR vs RCL und RCR: Beim Rotieren durch Carry wird das Carry-Bit als 9., 17., 33. oder 65. Bit miteinbezogen.
- Logical vs. Arithmetic Shift: Bezieht sich auf die Vorzeichenbehandlung. Für arithmetic Shift wird die Zahl als vorzeichenbehaftet im Zweierkomplement gelesen wird. Deshalb wird beim Right-Shift nicht zwingend eine 0 als höchstwertiges Bit eingefügt, sondern je nach Vorzeichen eine 0 oder eine 1.
Heutige CPUs haben Barrelshifter oder etwas vergleichbares eingebaut und können deshalb auch Shift- und Rotate-Operationen um mehr als eine Bit-Position schnell ausführen.
Wie die Befehle genau heißen, und welche es gibt, hängt vom Prozessor ab:
Beispiele (8 Bit), Verschiebung oder Rotation nur um eine Bitposition:
Vorher (Carrybit in Klammern) | ROL (rotate left) | RCL (rotate left through carry) | ROR (rotate right) | RCR (rotate right through carry) | ASL / SHL (arithmetic/logical shift left) | SHR (logical shift right) | ASR (arithmetic shift right) |
---|---|---|---|---|---|---|---|
00000000 (0) | 00000000 (0) | 00000000 (0) | 00000000 (0) | 00000000 (0) | 00000000 (0) | 00000000 (0) | 00000000 (0) |
00000000 (1) | 00000000 (1) | 00000001 (0) | 00000000 (1) | 10000000 (0) | 00000000 (0) | 00000000 (0) | 00000000 (0) |
00000001 (0) | 00000010 (0) | 00000010 (0) | 10000000 (0) | 00000000 (1) | 00000010 (0) | 00000000 (1) | 00000000 (1) |
00000001 (1) | 00000010 (1) | 00000011 (0) | 10000000 (1) | 10000000 (1) | 00000010 (0) | 00000000 (1) | 00000000 (1) |
10000000 (0) | 00000001 (0) | 00000000 (1) | 01000000 (0) | 01000000 (0) | 00000000 (1) | 01000000 (0) | 11000000 (0) |
10000000 (1) | 00000001 (1) | 00000001 (1) | 00000001 (1) | 11000000 (0) | 00000000 (1) | 01000000 (0) | 11000000 (0) |
11111111 (0) | 11111111 (0) | 11111110 (1) | 11111111 (0) | 01111111 (1) | 11111110 (1) | 01111111 (1) | 11111111 (1) |
11111111 (1) | 11111111 (1) | 11111111 (1) | 11111111 (1) | 11111111 (1) | 11111110 (1) | 01111111 (1) | 11111111 (1) |
Diese Shift- und Rotate-Operationen braucht man vor allem, um Multiplikation mit Zweierpotenzen und Division durch Zwierpotennzen auszudrücken. In C, C++, Perl, Java und einigen anderen Programmiersprachen gibt es diese Operationen „<<" (für ASL oder SHL), ">>“ (für SHR) und „>>>“ für ASR.
Schreibe einen Kommentar