我这样做
def power_two(n, base = -1):
result = 2 ** base
if result < n:
base += 1
power_two(n, base)
else:
if result == n:
print base
else:
print base - 1
什么是pythonic方法找到小于X数的两个最大功率?
EDIT 例如:power_two(100)仅返回功率
答案 0 :(得分:26)
找到对数并截断它:
def power_two(n):
return int(math.log(n, 2))
答案 1 :(得分:18)
您可以使用bit_length():
def power_two(n):
return n.bit_length() - 1
根据n != 0
的定义:2**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()
答案 2 :(得分:6)
两种方式,首先只适用于Python 2.7,也许只适用于3 +:
import random
for number in (random.randint(0,1<<32) for _ in range(16)):
print "%20i,%4i, %4i" % (number, number.bit_length()-1, len(bin(number))-3)
答案 3 :(得分:0)
def maxPowOf2(n):
return len("{0:b}".format(n))-1
这个答案与@jfs类似,但可能比@jfs慢...
将数字转换为二进制字符串并找到长度。
虽然不能在负数上正常工作...
答案 4 :(得分:-2)
嗯,我确定其他建议有效,但我觉得它们的表现会非常慢。我实际上没有验证过任何速度,但这应该非常快!
这也是Java。所以你需要转换它。
public static int getPowerOfTwo(int size)
{
int n = -1;
while (size >> ++n > 0);
return (1 << n - 1 == size) ? size : 1 << n;
}
public static int getNextPowerOfTwo(int size)
{
int n = -1;
while (size >> ++n > 0);
return 1 << n;
}
public static int getPreviousPowerOfTwo(int size)
{
int n = -1;
while (size >> ++n > 0);
return 1 << n - 1;
}