[fpc-pascal] Bitcounting
Santiago A.
svaa at ciberpiula.net
Sat Mar 5 20:03:01 CET 2016
El 05/03/16 a las 19:03, Bart escribió:
> Hi,
>
> Does FreePascal have a routine for counting bits?
> So that e.g. BitCount(%1001100100001) gives 5 (number of bits that are 1)?
>
> I came up with (extracted from IntToBin()):
>
> function BitCount(N: Int64): Integer;
> var
> Q: QWord;
> i: Integer;
> begin
> Result := 0;
> Q := QWord(N);
> for i := 0 to (8 * SizeOf(N) - 1) do
> begin
> if ((Q and 1) = 1) then Inc(Result);
> Q := Q shr 1;
> end;
> end;
>
> Surely this can be done better?
function BitCount_for(N: Int64): Integer;
var
Q: QWord;
i: Integer;
begin
Result := 0;
Q := QWord(N);
for i := 0 to (8 * SizeOf(N) - 1) do
begin
inc(result,(Q and 1));
Q := Q shr 1;
end;
end;
function BitCount_while(N: Int64): Integer;
var
Q: QWord;
i: Integer;
begin
Result := 0;
Q := QWord(N);
While Q>0 do begin
inc(result,(Q and 1));
Q := Q shr 1;
end;
end;
The while version is slower if the first bit is 1
>
> Bart
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
--
Santiago A.
svaa at ciberpiula.net
More information about the fpc-pascal
mailing list