Длина бита положительного целого в Python

1 = 0b1 -> 1 5 = 0b101 -> 3 10 = 0b1010 -> 4 100 = 0b1100100 -> 7 1000 = 0b1111101000 -> 10 … 

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

6 Solutions collect form web for “Длина бита положительного целого в Python”

 import math def number_of_bits(n): return int(math.log(n, 2)) + 1 

В python 2.7+ существует метод int.bit_length() :

 >>> a = 100 >>> a.bit_length() 7 
 >>> len(bin(1000))-2 10 >>> len(bin(100))-2 7 >>> len(bin(10))-2 4 

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

 def bitcounter(n): return math.floor(math.log(n,2)) + 1 

EDIT зафиксирован так, чтобы он работал с 1

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

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

 _HEX_BIT_COUNT_MAP = { '0': 0, '1': 1, '2': 2, '3': 2, '4': 3, '5': 3, '6': 3, '7': 3} def bit_count(a): """Returns the number of bits needed to represent abs(a). Returns 1 for 0.""" if not isinstance(a, (int, long)): raise TypeError if not a: return 1 # Example: hex(-0xabc) == '-0xabc'. 'L' is appended for longs. s = hex(a) d = len(s) if s[-1] == 'L': d -= 1 if s[0] == '-': d -= 4 c = s[3] else: d -= 3 c = s[2] return _HEX_BIT_COUNT_MAP.get(c, 4) + (d << 2) # Use int.bit_length and long.bit_length introduced in Python 2.7 and 3.x. if getattr(0, 'bit_length', None): __doc = bit_count.__doc__ def bit_count(a): return a.bit_length() or 1 bit_count.__doc__ = __doc assert bit_count(0) == 1 assert bit_count(1) == 1 assert bit_count(2) == 2 assert bit_count(3) == 2 assert bit_count(63) == 6 assert bit_count(64) == 7 assert bit_count(75) == 7 assert bit_count(2047) == 11 assert bit_count(2048) == 12 assert bit_count(-4007) == 12 assert bit_count(4095) == 12 assert bit_count(4096) == 13 assert bit_count(1 << 1203) == 1204 assert bit_count(-(1 << 1203)) == 1204 assert bit_count(1 << 1204) == 1205 assert bit_count(1 << 1205) == 1206 assert bit_count(1 << 1206) == 1207 

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

В противном случае len(bin(n))-2 как предложено YOU, выполняется быстро (потому что оно реализовано на 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 еще быстрее, но это не важно, поскольку это неправильно).

Python - лучший язык программирования в мире.