how to get the thighest bit position in big integers?

Thomas Heller theller at python.net
Tue Oct 7 07:26:26 EDT 2008


Mark Dickinson schrieb:
> On Oct 5, 11:40 pm, Terry Reedy <tjre... at udel.edu> wrote:
>> Your point, that taking floor(log2(x)) is redundant, is a good catch.
>> However, you should have added 'untested' ;-).  When value has more
>> significant bits than the fp mantissa can hold, this expression can be 1
>> off (but no more, I assume).   The following correction should be
>> sufficient:
>>
>> res = math.frexp(value)[1] - EXP_OF_ONE
>> test = 1<<res
>> if test > r:     res -= 1
>> elif 2*test < r: res += 1
>>
>> For value = 2**n -1, n > 53, it is always 1 too high on my Intel
>> machine, so the first correction is sometimes needed.  I do not know if
>> the second is or not.
> 
> See also http://bugs.python.org/issue3439
> where there's a proposal to expose the _PyLong_NumBits method.  This
> would give an O(1) solution.
> 
> Mark

Here is ctypes code that works (tested with Python 2.5):

from ctypes import *

_PyLong_NumBits = pythonapi._PyLong_NumBits
_PyLong_NumBits.argtypes = py_object,
_PyLong_NumBits.restype = c_int

for i in range(64):
    x = 1 << i
    print i, _PyLong_NumBits(long(x))


Thomas



More information about the Python-list mailing list