[英]count number of ones in a given integer
您如何计算给定整数的二进制表示中的 1 的数量。
假设你得到一个数字20
,它是二进制的10100
,所以 1 的数量是 2。
您正在寻找的称为汉明权重,并且有很多算法可以做到这一点。 这是另一个简单的:
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()
,返回给定整数的二进制展开式中 1 的数量,也称为人口计数,如下所示:
n = 20
bin(n)
'0b10100'
n.bit_count()
返回2
因为它在二进制表示中有 2 个 1。
我是一名新的编码员,我发现这个逻辑很简单。 新手可能更容易理解。
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))
是将x
的二进制表示中除最后一个(最低有效位)之外的所有 1 替换为 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']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.