Und hier noch eine etwas veränderte Version für Delphi 10.4:
Delphi-Quellcode:
Function Bitmask(Value, Position: Cardinal): Cardinal;
var
i: Integer;
Bitcounter: Cardinal;
cntOfBitsSet: Integer;
valSet: TIntegerSet;
begin
result := 0;
cntOfBitsSet := CountPopulation32(value);
If (cntOfBitsSet > 0)
and (Position > 0)
Then
begin
if cntOfBitsSet < Position
then
Position := ((Position - 1)
mod cntOfBitsSet) + 1;
valSet := TIntegerSet(Value);
Bitcounter := Position;
for i
in valSet
do
begin
dec(Bitcounter);
if Bitcounter = 0
then
Exit(1
shl i);
end;
end;
end;