【发布时间】:2013-03-10 13:34:38
【问题描述】:
如何计算给定整数的二进制表示中的个数。
假设给你一个数字20,二进制是10100,所以个数是2。
【问题讨论】:
标签: python python-2.7
如何计算给定整数的二进制表示中的个数。
假设给你一个数字20,二进制是10100,所以个数是2。
【问题讨论】:
标签: python python-2.7
您要查找的是Hamming weight,有很多算法可以做到这一点。这是另一个直截了当的:
def ones(n):
w = 0
while (n):
w += 1
n &= n - 1
return w
【讨论】:
a &= b 等价于a = a & (b)。 & 是 bitwise AND operator。
使用很棒的 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() 慢
【讨论】:
Counter
Counter 的人也没有用它来解决这个问题;)
>>> num = 20
>>> bin(num)[2:].count('1')
2
【讨论】:
0b 前缀不包含任何前缀。
使这种致盲快速的常用方法是使用查找表:
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 的解决方案都会更快,但如果你想用汇编程序编写它,这很好。
【讨论】:
n & 255 将比n % 256 快得多。
n & 256而不是n & 255。
您可以使用位移>> 和按位和& 来检查最低有效位,如下所示:
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)) 是将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']
【讨论】:
str.count('1')。如果您使用 Counter,也无需转换为列表