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

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

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

Ответ 1

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

Ответ 2

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

>>> a = 100
>>> a.bit_length()
7

Ответ 3

>>> len(bin(1000))-2
10
>>> len(bin(100))-2
7
>>> len(bin(10))-2
4

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

Ответ 4

Если у вашей версии 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 еще быстрее, но это не важно, так как это неправильно.)

Ответ 5

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

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

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

Ответ 6

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

n = 5
print(n.bit_length())

Ответ 7

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

EDIT исправлено так, что оно работает с 1

Ответ 8

Это решение использует .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