你如何计算给定整数的二进制表示中的个数。
假设给你一个数字20
,它是10100
二进制的,所以个数是 2。
您正在寻找的东西称为Hamming weight,并且有很多算法可以做到这一点。这是另一个简单的:
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
和的解决方案list.count
都会更快,但如果你想用汇编程序编写它,这很好。
您可以使用位移>>
和按位来执行此操作,并&
检查最低有效位,如下所示:
def count_ones(x):
result = 0
while x > 0:
result += x & 1
x = x >> 1
return result
这是通过将位向右移动直到值变为零来实现的,同时计算最低有效位为 1 的次数。
该int
类型从 python 3.10a 开始有一个新方法int.bit_count()
,返回给定整数的二进制扩展中的个数,也称为人口计数,如下所示:
n = 20
bin(n)
'0b10100'
n.bit_count()
返回2
,因为它在二进制表示中有 2 个。
我是一名新编码员,我发现这个逻辑很简单。新手可能更容易理解。
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
对于需要快速检查整数的二进制形式是否x
只有一个 1(因此是 2 的幂)的特殊情况,可以使用以下检查:
if x == -(x | (-x)):
...
该表达式-(x | (-x))
是将二进制表示中除最后一个(最低有效位)之外的所有 1 替换为x
0 时得到的数字。
例子:
12 = 1100 二进制
-12 = ...110100 二进制(具有无限数量的前导 1)
12 | (-12) = ...111100 二进制(有无限数量的前导 1)
-(12 | (-12)) = 100 二进制
如果输入数字是“数字”
number =20
len(bin(number)[2:].replace('0',''))
另一种解决方案是
from collections import Counter
Counter(list(bin(number))[2:])['1']