为何int.bit_count()等效于bin(self).count("1")且不统计二进制中的0?
关于Python int.bit_count()的两个疑问解答
先明确背景:Python 3.11+ 中的int.bit_count()方法返回整数绝对值二进制表示中1的个数(也叫种群计数),用bin(self).count("1")模拟实现能得到完全相同的结果。
疑问1:为什么int.bit_count()和bin(self).count("1")结果相等?
- 对正整数
n来说,bin(n)返回带0b前缀的二进制字符串(比如bin(19)是'0b10011'),字符串里的1的数量就是n二进制表示中1的个数,和n.bit_count()的统计目标完全匹配。 - 对负整数
-n来说,bin(-n)返回'-0bxxxx'格式的字符串,count("1")只会统计xxxx部分的1,这正好是n(即原数的绝对值)的二进制中1的个数,而(-n).bit_count()本身就返回原数绝对值的二进制1的个数,所以结果也一致。 - 本质上,
bit_count()的设计逻辑就是统计整数绝对值二进制中的1的数量,而bin()生成的字符串里的1的数量刚好对应这个统计结果,所以两者输出相等。
疑问2:为什么bit_count()不统计二进制中的0?
- 这个方法的核心是实现种群计数(population count),这是计算机领域的标准术语,定义就是统计二进制表示中1的个数,常用于哈希计算、密码学、位运算优化等场景,本身就和0的数量无关。
- 另外,Python的整数是任意精度的,没有固定位数限制(不像C语言里的int有32位/64位固定长度),如果要统计0的数量,根本没法确定“总位数”——比如数字5的二进制可以是
101,也可以补位成000101,不同补位方式得到的0的数量完全不同,统计0没有统一的实际意义。
示例代码验证
# 正整数测试 n = 19 print(bin(n)) # 输出 '0b10011' print(n.bit_count()) # 输出 3 print(bin(n).count("1")) # 输出 3 # 负整数测试 print(bin(-n)) # 输出 '-0b10011' print((-n).bit_count())# 输出 3 print(bin(-n).count("1")) # 输出 3
内容的提问来源于stack exchange,提问作者Đỗ Như Vỹ
相关产品推荐
相关产品推荐

