发现两个小于X的最大功率?

时间:2010-09-26 11:29:51

标签: find python

我这样做

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)仅返回功率

5 个答案:

答案 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)

利用.format的强大功能!

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;
}