Zitat:
Delphi-Quellcode:
Mask := 0;
...
if Mask = 0 then
Mask := 1;
Warum nicht gleich richtig initialisieren? (
:= 1;
)
Und was die doppelte Prüfung soll, hab ich nicht verstanden.
Denn aus
if CheckBit($2A, 5) = 32 then
wird
if $2A and (1 shl 5) = 32 then
,
(wenn ich den Inhalt deiner Funktion wegoptimiere und den Fall "Bit nicht gesetzt" igonriere, da er für dieses IF egal ist)
obwohl
if $2A and (1 shl 5) <> 0 then
, bzw
if $2A and 32 <> 0 then
ausreicht,
oder einfach nur
if Ord($2A shr 5) then
.
Das Beispiel genommen und alles überflüssige rausgeworfen, da sich dieses Problem mit binärer Mathemaik lösen lässt.
Delphi-Quellcode:
function CheckBit(const Value, BitNumber: Integer): Boolean; inline;
begin
Result := Ord(Value shr BitNumber); //Result := (Value shr BitNumber) and $01 <> 0;
end;
oder
(für Alle, die lieber links als rechts sind)
Delphi-Quellcode:
function CheckBit(const Value, BitNumber: Integer): Boolean; inline;
begin
Result := Value and (1 shl BitNumber) <> 0;
end;
OK, mathematisch geht auch
Delphi-Quellcode:
function CheckBit(const Value, BitNumber: Integer): Boolean; inline;
begin
Result := Value and Round(IntPower(2, BitNumber)) <> 0;
end;
function CheckBit(const Value, BitNumber: Integer): Boolean; inline;
begin
Result := (Value div Round(IntPower(2, BitNumber))) and $01 <> 0;
end;
PS:
Delphi-Quellcode:
function KleinstesBit(Value: Integer): Integer;
begin
if Value = 0 then
Exit(-1);
Result := 0;
while not Odd(Value) do begin
Inc(Result);
Value := Value shr 1;
end;
end;