给定 x < 10^15
,快速准确地确定最大整数p
,使得2^p <= x
这是我尝试过的一些方法:
首先,我尝试了这个方法,但对于大数不准确:
>>> from math import log
>>> x = 2**3
>>> x
8
>>> p = int(log(x, 2))
>>> 2**p == x
True
>>> x = 2**50
>>> p = int(log(x, 2))
>>> 2**p == x #not accurate for large numbers?
False
我可以尝试一些类似的东西:
p = 1
i = 1
while True:
if i * 2 > n:
break
i *= 2
p += 1
not_p = n - p
如果p等于50,则需要进行50次操作。
我可以预先计算2的幂直到2^50,然后使用二分查找来找到p。这将需要大约log(50)次操作,但似乎有点过度和丑陋?
我在这个线程中找到了C语言解决方案:Compute fast log base 2 ceiling
然而,这似乎有点不太好看,我也不确定如何将其转换为Python。
2^p <= x
,那么p == floor(log(x,2))
。 - Bob Steinq == ceil(log(x,2))
一样。 - Bob Stein