Битовая длина положительного целого числа в Python - PullRequest
36 голосов
/ 16 апреля 2010
1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…

Как я могу получить длину в битах целого числа, то есть количество битов, необходимых для представления положительного целого числа в Python?

Ответы [ 7 ]

162 голосов
/ 16 апреля 2010

В Python 2.7+ есть метод int.bit_length():

>>> a = 100
>>> a.bit_length()
7
22 голосов
/ 16 апреля 2010
>>> len(bin(1000))-2
10
>>> len(bin(100))-2
7
>>> len(bin(10))-2
4

Примечание : не будет работать для отрицательных чисел, возможно, потребуется вычесть 3 вместо 2

1 голос
/ 03 февраля 2012

Если ваша версия Python имеет его (≥2.7 для Python 2, ≥3.1 для Python 3), используйте метод bit_length из стандартной библиотеки.

В противном случае len(bin(n))-2 в соответствии с предложением ВАС быстро (потому что оно реализовано в Python). Обратите внимание, что это возвращает 1 для 0.

В противном случае простой метод состоит в том, чтобы повторно делить на 2 (что является прямым сдвигом битов) и подсчитывать, сколько времени требуется для достижения 0.

def bit_length(n): # return the bit size of a non-negative integer
    bits = 0
    while n >> bits: bits += 1
    return bits

Это значительно быстрее (по крайней мере, для больших чисел - быстрые тесты говорят, что более чем в 10 раз быстрее для 1000 цифр) сдвигаться на целые слова за раз, затем возвращаться и работать с битами последнего слова.

def bit_length(n): # return the bit size of a non-negative integer
    if n == 0: return 0
    bits = -32
    m = 0
    while n:
        m = n
        n >>= 32; bits += 32
    while m: m >>= 1; bits += 1
    return bits

В моем быстром тесте len(bin(n)) вышел значительно быстрее, чем даже версия с размером слова. Хотя bin(n) создает строку, которая немедленно отбрасывается, она выходит на первое место благодаря наличию внутреннего цикла, скомпилированного для машинного кода. (math.log еще быстрее, но это не важно, поскольку это неправильно.)

0 голосов
/ 06 июня 2018

Просто сохраните значение в переменной и получите доступ к bit_length(). Доступно в Python 2 и 3.

n = 5
print(n.bit_length())
0 голосов
/ 03 января 2018

Вот еще один способ:

def number_of_bits(n):
    return len('{:b}'.format(n))

Полагаю, не так эффективно, но не появляется ни в одном из предыдущих ответов ...

0 голосов
/ 02 декабря 2012

Это решение использует .bit_length(), если доступно, и возвращается к len(hex(a)) для более старых версий Python. Он имеет преимущество перед bin в том, что создает меньшую временную строку, поэтому использует меньше памяти.

Обратите внимание, что возвращается 1 для 0, но это легко изменить.

* +1007 *
0 голосов
/ 16 апреля 2010
def bitcounter(n):
    return math.floor(math.log(n,2)) + 1

РЕДАКТИРОВАТЬ исправлено, так что он работает с 1

...