11

指定された整数のバイナリ表現の 1 の数をどのように数えますか。

number が与えられたとします20。これは101002 進数なので、1 の数は 2 です。

4

10 に答える 10

11

あなたが探しているのはハミング重みと呼ばれ、それを行うためのアルゴリズムはたくさんあります。もう1つの簡単な方法は次のとおりです。

def ones(n):
    w = 0
    while (n):
        w += 1
        n &= n - 1
    return w
于 2013-03-21T06:31:03.500 に答える
7

素晴らしい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()

于 2013-03-21T06:27:16.990 に答える
5
>>> num = 20
>>> bin(num)[2:].count('1')
2
于 2013-03-21T06:28:36.267 に答える
4

この目くらましを高速化する通常の方法は、ルックアップ テーブルを使用することです。

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 では、binandを使用したソリューションはすべてlist.count高速になりますが、アセンブラーで記述したい場合はこれが便利です。

于 2013-03-21T06:37:53.323 に答える
2

str.countメソッドとbin関数は、この小さな課題を短時間で解決します

>>> def ones(x):
        "Count the number of ones in an integer's binary representation"
        return bin(x).count('1')

>>> ones(20)
2
于 2013-03-21T06:29:42.937 に答える
-1

入力数値が 'number' の場合

number =20
len(bin(number)[2:].replace('0',''))

別の解決策は

from collections import Counter

Counter(list(bin(number))[2:])['1']
于 2013-03-21T06:24:04.617 に答える