найти наибольшую степень двух меньше, чем число Х? - PullRequest
14 голосов
/ 26 сентября 2010

Я делаю это

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?

EDIT пример: power_two (100) возвращает только мощность

Ответы [ 5 ]

26 голосов
/ 26 сентября 2010

Найдите логарифм и обрежьте его:

def power_two(n):
    return int(math.log(n, 2))
18 голосов
/ 26 сентября 2010

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

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

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

6 голосов
/ 26 сентября 2010

Два способа, первый работает только в 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)
0 голосов
/ 28 октября 2018

используя силу .format!

def maxPowOf2(n):
     return len("{0:b}".format(n))-1

Этот ответ похож и может быть медленнее, чем @jfs, хотя ...
переводит число в двоичную строку и находит длину.* Не работает должным образом с отрицательными числами, хотя ...

0 голосов
/ 16 ноября 2012

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

Это также на 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...