Hat das One einen besonderen Grund?
Das sollte doch im Prinzip eigentlich eine Konstante sein, dann noch Value(Cardinal) und One(Byte) zu verrechnen ist bestimmt auch nicht sonderlich optimal.
One als Cardinal wäre da besser, oder eben direkt als Konstante.
Ach ja, BOOL (LongBool bei 32 Bit) wäre bestimmt auch Optimaler, als Boolean.
Ich kenn leider keinen direkten booleanischen Delphi/Pascal-Typen, welcher sich anpaßt, aber die Windows-Adaption vom BOOL geht ja och.
In die Falle mit dem nicht mitwachsenden Integer sollten wir auch nicht gleich zu Anfang reinfallen, also NativeInt/NativeUInt.
Wie ist das Eigentlich mit der Geschwindigkeit von Sprüngen? (JUMPs)
Bei meinem Code gibt es 1 bis 2 Variablen weniger, aber dafür einen weiteren JUMP, wegen dem ELSE. (wenn nötig, ginge dann vermutlichdie zusätzliche LOOP)
Delphi-Quellcode:
{$IF not Defined(NativeInt)}
const
NativeInt = Integer;
NativeUInt = Cardinal;
{$IFEND}
function CRCSetup(
var CRCDef: TCRCDef; Polynomial, Bits, InitVector,
FinalVector: NativeUInt; Inverse: BOOL): Boolean;
// initialize CRCDef according to the parameters, calculate the lookup table
const
HighBit = $1
shl (SizeOf(NativeUInt) * 8 - 1);
var
Index, Value, XorValue, OldValue: NativeUInt;
B: BOOL;
begin
if Bits >= 8
then
begin
CRCDef.Polynomial := Polynomial;
CRCDef.Bits := Bits;
CRCDef.CRC := InitVector;
CRCDef.InitVector := InitVector;
CRCDef.FinalVector := FinalVector;
CRCDef.Inverse := Inverse;
CRCDef.Shift := Bits - 8;
CRCDef.Mask := -1
shr Byte(Bits);
if Inverse
then
begin
Bits := CRCDef.Bits;
XorValue := 0;
repeat
Inc(XorValue, XorValue + Polynomial
and $1);
Polynomial := Polynomial
shr 1;
Dec(Bits);
until Bits = 0;
for Index := 255
downto 0
do
begin
Value :=
Index;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
if BOOL(Value
and $1)
then Value := (Value
shr 1)
xor XorValue
else Value := Value
shr 1;
CRCDef.Table[
Index] := Value;
end;
end
else
begin
Bits := -(Bits - 32);
XorValue := Polynomial
and CRCDef.Mask;
XorValue := (XorValue
shl Byte(Bits))
or (XorValue
shr (32 - Byte(Bits)));
for Index := 255
downto 0
do
begin
if BOOL(
Index and $80)
then Value := (
Index shl 25)
xor XorValue
else Value :=
Index shl 25;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
if BOOL(Value
and HighBit)
then Value := (Value
shl 1)
xor XorValue
else Value := Value
shl 1;
// oder
// if NativeInt(Value) < 0 then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
// statt dem
// if BOOL(Value and HighBit) then Value := (Value shl 1) xor XorValue else Value := Value shl 1;
Value := (Value
shr Byte(Bits))
or (Value
shl (32 - Byte(Bits)));
CRCDef.Table[
Index] := Value;
end;
end;
Result := True;
end
else
Result := False;
end;