11

你如何计算给定整数的二进制表示中的个数。

假设给你一个数字20,它是10100二进制的,所以个数是 2。

4

10 回答 10

11

您正在寻找的东西称为Hamming weight,并且有很多算法可以做到这一点。这是另一个简单的:

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 中,任何使用bin和的解决方案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

您可以使用位移>>和按位来执行此操作,并&检查最低有效位,如下所示:

def count_ones(x):
    result = 0
    while x > 0:
        result += x & 1
        x = x >> 1
    return result

这是通过将位向右移动直到值变为零来实现的,同时计算最低有效位为 1 的次数。

于 2020-01-29T16:00:11.927 回答
1

int类型从 python 3.10a 开始有一个新方法int.bit_count(),返回给定整数的二进制扩展中的个数,也称为人口计数,如下所示:

n = 20
bin(n)
'0b10100'

n.bit_count()返回2,因为它在二进制表示中有 2 个。

于 2020-09-19T19:04:32.070 回答
0

我是一名新编码员,我发现这个逻辑很简单。新手可能更容易理解。

def onesInDecimal(n):
  count = 0
  while(n!=0):
    if (n%2!=0):
        count = count+1
        n = n-1
        n = n/2
    else:
        n = n/2
  return count
于 2017-06-24T13:22:31.813 回答
0

对于需要快速检查整数的二进制形式是否x只有一个 1(因此是 2 的幂)的特殊情况,可以使用以下检查:

if x == -(x | (-x)):
    ...

该表达式-(x | (-x))是将二进制表示中除最后一个(最低有效位)之外的所有 1 替换为x0 时得到的数字。

例子:

12 = 1100 二进制

-12 = ...110100 二进制(具有无限数量的前导 1)

12 | (-12) = ...111100 二进制(有无限数量的前导 1)

-(12 | (-12)) = 100 二进制

于 2021-12-27T23:35:25.820 回答
-1

如果输入数字是“数字”

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

另一种解决方案是

from collections import Counter

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