Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: Index vom x-tem gesetztem Bit

  Alt 2. Jun 2020, 10:54
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;
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 2. Jun 2020 um 10:56 Uhr)
  Mit Zitat antworten Zitat