Python实现比特位计数函数返回值不符预期如何解决
问题原因
你的代码逻辑和需求完全不匹配,返回错误结果的核心原因有两个:
- 你要统计的是数值的二进制比特位中1的数量,但现有代码是把输入的整数转成十进制字符串后,逐位累加十进制数位的和。你传入的二进制串
00000000000000000000000000001011对应的十进制整数是11,str(11)得到的字符串是"11",累加结果自然是2,和预期的3不符。 - Python不支持直接写前缀带0的十进制整数字面量,你如果直接把
00000000000000000000000000001011当整数传会直接触发语法错误,说明你传入的实际是转换后的整数11,完全没有做二进制维度的判断。
实现思路
统计二进制位中1的个数(汉明重量)有三种常用的可靠方案:
- 内置函数法:用Python内置
bin()函数把整数转为带0b前缀的二进制字符串,直接统计字符串中'1'的数量,写法最简洁 - 位运算法:利用
n & (n-1)可以消去二进制表示最右侧1的特性,循环计数直到n为0,时间复杂度和二进制中1的个数一致,效率最高 - 移位统计法:循环将数字右移,每次判断最低位是否为1并累计计数,逻辑最直白易懂
可直接使用的代码示例
- 简洁内置函数版(日常开发优先用)
def countBit(self, n: int) -> int: return bin(n).count('1')
- 高效位运算版(适合超大数值场景)
def countBit(self, n: int) -> int: res = 0 while n: n &= n - 1 res += 1 return res
- 直观移位版(适合新手理解逻辑)
def countBit(self, n: int) -> int: res = 0 while n: res += n & 1 n >>= 1 return res
如果你传入的参数本身就是二进制格式的字符串(比如直接传
"00000000000000000000000000001011"),不需要转整数,直接统计字符串中'1'的数量即可:def countBit(self, binary_str: str) -> int: return binary_str.count('1')
内容的提问来源于stack exchange,提问作者AGS
相关产品推荐
相关产品推荐

