Actually, I suspect GHC's strictness analyzer will give you
reasonable performance with even the naive version, but fancier ideas
are at http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog
The problem with all those, however, is since they do bit-twiddling
and use shifts and masks, they're designed to, as far as I can tell,
only work on integers of defined sizes (the names given to the
functions to the contrary). You could, of course, dynamically choose
how many masks to apply based on the length of the Integer in
question, which can, if all else fails, be determined by unpacking it
into the primitives, which are (# Int#, ByteArr# #) with the Int# as
the number of "limbs" of the integer, as well as its sign. As far as
I understand it, each "limb" is generally 32 bits.
Unless this is a real performance hotspot, you're probably fine
sticking with a relatively naive version. For example, in my
translation of the clean version of the meteor-contest shootout
entry, I used the following function (which, I'll grant, does
something slightly different):
first0 :: Mask -> Int
first0 i
| i .&. 1 == 0 = 0
| otherwise = 1 + first0 (i `shiftR` 1)
and it worked out fine for my purposes.
--s.
On Dec 3, 2007, at 11:36 PM, Dan Piponi wrote:
Is there anything in any of the interfaces to Integer that will allow
me to quickly find the highest bit set in an Integer? If not, does
anyone have any recommendations for how to do it efficiently. There
are some obvious things that come to mind but which might involve
quite a bit of useless copying of data internally by the
implementation of Integer.
--
Dan
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe