Beispiel: 42 = Binär 00101010, suche das fünfte gesetzte Bit von rechts.
Sind ja nur 3 Bit gesetzt also vorne wieder anfangen.
Ergebnis wäre dann 8
Ah jetzt ja!
Jetzt habe ich wohl endlich verstanden, was du meinst mit:
suche das fünfte gesetzte Bit von rechts
Dann kann man die Funktion aber auch deutlich vereinfachen: Der Unfug mit dem 'Richtungswechsel' kann entfallen und es können 32-Bit Parameter und Variablen verwendet werden.
Und Uwe Raabes Hinweis ist auch berücksichtigt.
Delphi-Quellcode:
Function Bitmask(Value,Position: cardinal):cardinal;
var i,len: Integer;
mask, Bitcounter: Cardinal;
begin
result:= 0;
If value <> 0 Then
begin
Bitcounter:= 0;
len:= (sizeof(value) * 8); // Anzahl der Bits
while Bitcounter <> Position do
begin
for i:= 0 to len - 1 do
begin
mask:= (1 shl i);
If value and mask <> 0 Then inc(Bitcounter);
if Bitcounter = Position then
begin
result:= Mask;
break;
end;
end;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
mask: Byte;
begin
mask := Bitmask(42,5);
Showmessage('Das '+inttostr(5)+'. Bit ist an Stelle ' + inttostr(mask));
end;
Auch ich grüble allerdings schon die ganze Zeit über die Frage, wozu das Ganze gut sein soll??
Gruß LP