繁体   English   中英

计算给定整数中 1 的数量

[英]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 中,任何使用binlist.count解决方案都会更快,但是如果您想用汇编程序编写它,这很好。

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

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM