Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#10

AW: wie mach ich einen aritmethic shift?

  Alt 1. Mai 2012, 22:46
aritmethic?
arithmetic

Delphi unterscheidet leider nicht so wirklich, zwischen arithmetisch und logisch/binär.
Obwohl es z.B. in den Record-Opertaoren vorgesehn ist, wird dennoch standardmäßig überall nur das logische/binäre Shift verwendet.

Nur bei den Booleans wird logisch gearbeitet, aber sonst eben überall nur binär. (and, or, not und xor)

Du könntest jetzt zwar mit den Operatoren versuchen dir ein arithmetisches Shift zu basteln oder du nutzt eben Funktionen dafür.
Delphi-Quellcode:
function {sal}AritmethicShiftLeft(i: Integer; Count: Byte): Integer;
asm
  SAL EAX, DL
end;

function {sar}AritmethicShiftRighti: Integer; Count: Byte): Integer;
asm
  SAR EAX, DL
end;
(nur für Win32 ... bei Win64 wurden ja die Register verschoben)

In Pascal würde der Code zwar plattformunabhängig, aber optimal würde der Code nicht wirklich.
Delphi-Quellcode:
function {sal}AritmethicShiftLeft(i, Count: Integer): Integer;
begin
  if Count < 0 then
    Exit(AritmethicShiftRight(i, -Count));
  Result := (i and $80000000) or ((i shl Count) and not $80000000);
end;

function {sar}AritmethicShiftRight(i, Count: Integer): Integer;
begin
  if Count < 0 then
    Exit(AritmethicShiftLeft(i, -Count));
  Result := (i and $80000000) or ((i shr Count) or (Integer(-1) shl (32 - Max(Count, 32))));
end;
(läßt sich aber bestimmt noch etwas optimieren)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Mai 2012 um 22:48 Uhr)
  Mit Zitat antworten Zitat