Bit twiddling
Luke Gorrie
<>
Thu Mar 31 20:04:32 CEST 2005
"Joel Reymont" <> writes:
> I'm looking to figure out the highest and lowest bit set in an integer as
> well as count the number of bits set.
If it needs to be fast then be sure to see what mathematician
assembler hackers have to say!
hackmem
http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html
Hacker's Delight
http://www.hackersdelight.org/
Count number of On bits in an integer
http://www-db.stanford.edu/~manku/bitcount/bitcount.html
Highest bit set is floor(log2(N)) if you figure out the floating
point, though Erlang doesn't have a log2 BIF. Tony Rogvall has a very
interesting "how many bits is this integer" function that makes the
runtime system do the real work in jungerl/lib/ssh/src/ssh_bits.erl:
isize(N) when N > 0 ->
case term_to_binary(N) of
<<?VERSION_MAGIC, ?SMALL_INTEGER_EXT, X>> ->
isize_byte(X);
<<?VERSION_MAGIC, ?INTEGER_EXT, X3,X2,X1,X0>> ->
isize_bytes([X3,X2,X1,X0]);
<<?VERSION_MAGIC, ?SMALL_BIG_EXT, S:8/big-unsigned-integer, 0,
Ds:S/binary>> ->
K = S - 1,
<<_:K/binary, Top>> = Ds,
isize_byte(Top)+K*8;
<<?VERSION_MAGIC, ?LARGE_BIG_EXT, S:32/big-unsigned-integer, 0,
Ds:S/binary>> ->
K = S - 1,
<<_:K/binary, Top>> = Ds,
isize_byte(Top)+K*8
end;
isize(0) -> 0.
i.e. encode the number in the binary Erlang external term format and
then pull that apart to see the length header :-)
More information about the erlang-questions
mailing list