Найти наибольшую мощность в два меньше, чем X?

Я делаю это

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

Каков питонический способ найти наибольшую мощность в два меньше, чем X?

ИЗМЕНИТЬ Например: power_two (100) возвращает только мощность

Ответы

Ответ 1

Найти логарифм и усечь его:

def power_two(n):
    return int(math.log(n, 2))

Ответ 2

Вы можете использовать bit_length():

def power_two(n):
    return n.bit_length() - 1

По определению для n != 0: 2**(n.bit_length()-1) <= abs(n) < 2**n.bit_length()

Ответ 3

Два способа, сначала работает только в 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)

Ответ 4

Хорошо, я уверен, что другие предложения работают, но я чувствую, что они будут выполнять очень медленно. Я на самом деле не проверял скорости, но это должно быть очень быстро!

Это также в 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;
}