📜  计算数组中的总设置位(1)

📅  最后修改于: 2023-12-03 14:57:31.222000             🧑  作者: Mango

计算数组中的总设置位

在开发者的日常工作中,需要处理很多二进制数值的操作。本篇介绍如何计算一个数组中所有元素的二进制中设置为1的总数,也就是所有元素的二进制中值为1的位数相加的结果。

实现思路
  1. 使用位运算符&来检查二进制数值序列中每一位上是否有值为1的二进制位。
  2. 使用循环结构遍历数组中的每个元素。
  3. 对每个元素进行遍历寻找其中二进制中值为1的位数,并将其求和,获得总设置位数。
代码实现
def count_bits(nums: List[int]) -> int:
    count = 0  # 总设置位数
    for num in nums:
        while num:
            count += num & 1
            num >>= 1
    return count
使用方法

将要计算的数组传入函数count_bits()中,即可获得数组中所有元素的二进制中设置为1的总数。

nums = [1, 5, 7, 10]
count = count_bits(nums)
print(count)  # 输出结果为: 9
性能优化

本算法的时间复杂度为$O(NM)$,其中$N$为数组元素个数,$M$为每个元素的二进制位数。为了优化时间复杂度,我们可以使用等效复杂度$O(N)$的位移运算来取代循环结构中的每位运算。

def count_bits(nums: List[int]) -> int:
    count = 0
    for num in nums:
        while num:
            count += 1
            num &= num - 1
    return count

我们知道,对任何大于0的整数$x$,$x$与$x-1$的按位与(&)运算结果会将$x$的最后一个1变成0。因此,不断地对$x$执行$x &= x-1$运算,直到$x$的值变为0,就可以算出$x$的二进制中数值为1的位数。这个算法的时间复杂度等效于对数组中每个元素的二进制中1的数量求和,因此时间复杂度为$O(N)$。

nums = [1, 5, 7, 10]
count = count_bits(nums)
print(count)  # 输出结果为: 9

以上就是计算数组中的总设置位的实现思路和方法。通过对二进制的位运算和循环遍历的运用,我们可以高效地计算任何数组中所有元素的二进制的总设置位数。