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)