指定された整数のバイナリ表現の 1 の数をどのように数えますか。
number が与えられたとします20
。これは10100
2 進数なので、1 の数は 2 です。
指定された整数のバイナリ表現の 1 の数をどのように数えますか。
number が与えられたとします20
。これは10100
2 進数なので、1 の数は 2 です。
あなたが探しているのはハミング重みと呼ばれ、それを行うためのアルゴリズムはたくさんあります。もう1つの簡単な方法は次のとおりです。
def ones(n):
w = 0
while (n):
w += 1
n &= n - 1
return w
素晴らしいcollections
モジュールを使用してください。
>>> from collections import Counter
>>> binary = bin(20)[2:]
>>> Counter(binary)
Counter({'0': 3, '1': 2})
または、組み込み関数を使用できますcount()
。
>>> binary = bin(20)[2:]
>>> binary.count('1')
2
あるいは:
>>> sum(1 for i in bin(20)[2:] if i == '1')
2
しかし、その最後の解決策は、使用するよりも遅いですcount()
>>> num = 20
>>> bin(num)[2:].count('1')
2
この目くらましを高速化する通常の方法は、ルックアップ テーブルを使用することです。
table = [bin(i)[2:].count('1') for i in range(256)]
def pop_count(n):
cnt = 0
while n > 0:
cnt += table[n & 256]
n >>= 8
return cnt
Python では、bin
andを使用したソリューションはすべてlist.count
高速になりますが、アセンブラーで記述したい場合はこれが便利です。
入力数値が 'number' の場合
number =20
len(bin(number)[2:].replace('0',''))
別の解決策は
from collections import Counter
Counter(list(bin(number))[2:])['1']