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

整数のビット長、つまり Python で正の整数を表すのに必要なビット数を取得するにはどうすればよいですか?

4

7 に答える 7

206

Python 2.7+にはint.bit_length()メソッドがあります:

>>> a = 100
>>> a.bit_length()
7
于 2010-04-16T15:32:07.593 に答える
23
>>> len(bin(1000))-2
10
>>> len(bin(100))-2
7
>>> len(bin(10))-2
4

: 負の数では機能しません。2 ではなく 3 を引く必要がある場合があります。

于 2010-04-16T15:30:38.500 に答える
8

Python のバージョンに含まれている場合 (Python 2 の場合は 2.7 以上、Python 3 の場合は 3.1 以上)、bit_length標準ライブラリのメソッドを使用します。

それ以外の場合は、len(bin(n))-2 YOUが示唆するように高速です (Python で実装されているため)。これは 0 に対して 1 を返すことに注意してください。

それ以外の場合、簡単な方法は、2 で除算を繰り返し (これは単純なビット シフトです)、0 になるまでの時間を数えることです。

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

一度に単語全体をシフトしてから、最後の単語のビットに戻って作業する方が大幅に高速です (少なくとも大きな数の場合 — 簡単なベンチマークでは 1000 桁の場合は 10 倍以上高速です)。

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これはさらに高速ですが、間違っているため重要ではありません。)

于 2012-02-03T19:11:06.817 に答える
3

ここでは、スライスも使用できます。

正の整数の場合、2 から開始します。

len(bin(1)[2:])
len(bin(5)[2:])
len(bin(10)[2:])
len(bin(100)[2:])
len(bin(1000)[2:])

これは次のように出力されます:

1
3
4
7
10

負の整数の場合、3 から開始します。

len(bin(-1)[3:])
len(bin(-5)[3:])
len(bin(-10)[3:])
len(bin(-100)[3:])
len(bin(-1000)[3:])

これは次のように出力されます:

1
3
4
7
10
于 2019-11-21T19:00:57.560 に答える
-1
def bitcounter(n):
    return math.floor(math.log(n,2)) + 1

EDITは1で動作するように修正しました

于 2010-04-16T15:26:10.407 に答える
-2

このソリューションは、利用可能な場合はそれを利用し、古いバージョンの Python に.bit_length()フォールバックします。より小さな一時文字列を作成するというlen(hex(a))利点があるため、使用するメモリが少なくなります。bin

0 に対して 1 を返しますが、これは簡単に変更できることに注意してください。

_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
于 2012-12-01T20:06:06.727 に答える