📅  最后修改于: 2023-12-03 14:57:31.222000             🧑  作者: Mango
在开发者的日常工作中,需要处理很多二进制数值的操作。本篇介绍如何计算一个数组中所有元素的二进制中设置为1的总数,也就是所有元素的二进制中值为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
以上就是计算数组中的总设置位的实现思路和方法。通过对二进制的位运算和循环遍历的运用,我们可以高效地计算任何数组中所有元素的二进制的总设置位数。