Thema: Delphi Hex -> Integer

Einzelnen Beitrag anzeigen

Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Hex -> Integer

  Alt 15. Dez 2004, 03:49
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:
Code:
2 + 2 * 2^1 
2 + 4 = 6

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;
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat