Ответ 1
Найти логарифм и усечь его:
def power_two(n):
return int(math.log(n, 2))
Я делаю это
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) возвращает только мощность
Найти логарифм и усечь его:
def power_two(n):
return int(math.log(n, 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()
Два способа, сначала работает только в 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)
Хорошо, я уверен, что другие предложения работают, но я чувствую, что они будут выполнять очень медленно. Я на самом деле не проверял скорости, но это должно быть очень быстро!
Это также в 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;
}