Machen wir es mal im Binärsystem:
Code:
4 : 2 = 2 (d)
100 : 010 = 010 (b)
8 : 2 = 4 (d)
1000 : 0010 = 0100 (b)
Was fällt auf? Teilt man im Binärsystem durch 2, entspricht dies eine Bit-Verschiebung um eine Stelle nach rechts. Aus 100 wird 010. Umgekehrt kann man daraus folgern, dass eine Bit-Verschiebung um eins nach links einer Multiplikation mit 2 (2^1) entspricht. Eine Bit-Verschiebung um 2 entspricht dann einer Multiplikation mit 4 (2^2). Eine Bit-Verschiebung um 3 entspricht einer Multiplikation mit 8. Die Bit-Verschiebung um 8 entspricht also einer Multiplikation mit 256 (2^8).
Beispiel:
4 shl 8 = 1024
4 * 2^8 = 4 * 256 = 1024
dizzy hat also nichts anderes gemacht als einen Wert mit 2^8 zu multiplizieren. Bzw. wenn man sich den ganzen Ausdruck anguckt:
Word(arr[0] or arr[1] shl 8)
hat er einen Wert mit 2^8 multipliziert und ihn mit einen anderen mit einem logischem
oder verknüpft.
Code:
010 or (010 shl 1)
010 or 100
010
or 100
------
110
entspricht:
Diese Schiebebefehle sind wesentlich schneller für die CPU durchzuführen als herkömmliche Multiplikationen. Auf dem 386er waren sie bis zu 40x schneller. Wenn man also mit einer Potenz von 2 Multiplizieren will, dann ist es sehr performant mit den Schiebebefehlen zu arbeiten.
Ein bißchen was zum Rumprobieren:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
lo, // left operand
so, // shift operand
res: Integer; // Result
begin
lo := $4;
so := 8;
res := $4 shl 8;
ShowMessage(Format('$%X shl %d = $%X (%dd)',[lo, so, res, res]));
end;