web-dev-qa-db-ja.com

Pythonの正の整数のビット長

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

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

39
user288832

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

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

:負の数では機能しません。2ではなく3を引く必要があるかもしれません

23
YOU

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

それ以外の場合、len(bin(n))-2YOUの提案どおり は高速です(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))がWordサイズのチャンクバージョンよりもはるかに高速に出力されました。 bin(n)はすぐに破棄される文字列を作成しますが、マシンコードにコンパイルされる内部ループがあるため、先頭に表示されます。 (_math.log_はさらに高速ですが、それは間違っているので重要ではありません。)

1
Gilles

別の方法を次に示します。

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

それほど効率的ではないと思いますが、以前の回答には表示されません...

0
goodvibration