1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…
Как я могу получить длину бита целого числа, то есть числа бит, которые необходимы для представления положительного целого числа в Python?
1 = 0b1 -> 1
5 = 0b101 -> 3
10 = 0b1010 -> 4
100 = 0b1100100 -> 7
1000 = 0b1111101000 -> 10
…
Как я могу получить длину бита целого числа, то есть числа бит, которые необходимы для представления положительного целого числа в 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
Если у вашей версии 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
еще быстрее, но это не важно, так как это неправильно.)
Вот еще один способ:
def number_of_bits(n):
return len('{:b}'.format(n))
Не так эффективно, я полагаю, но не появляется ни в одном из предыдущих ответов...
Просто сохраните значение в переменной и получите доступ к нему bit_length()
. Доступно как в Python 2, так и 3.
n = 5
print(n.bit_length())
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