You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python位运算高效统计整数二进制的连续前导1个数

用Python位运算统计整数二进制连续前导1的个数

需求明确:给定整数,无需字符串转换,纯靠位运算统计其二进制表示中连续前导1的数量,比如0返回0,3(0b11)返回2,7(0b111)返回3等。

方法1:二分法位运算(高效,适配固定位数整数)

通过二分思想结合位掩码快速定位前导1的长度,时间复杂度为O(log n)(n为整数的二进制位数),适合处理固定位数的整数(如32位、64位)。

以32位整数为例,代码实现:

def count_leading_ones(x):
    if x == 0:
        return 0
    count = 0
    # 检查高16位是否全为1
    if (x & 0xFFFF0000) == 0xFFFF0000:
        count += 16
        x <<= 16
    # 检查剩余部分的高8位
    if (x & 0xFF000000) == 0xFF000000:
        count += 8
        x <<= 8
    # 检查剩余部分的高4位
    if (x & 0xF0000000) == 0xF0000000:
        count += 4
        x <<= 4
    # 检查剩余部分的高2位
    if (x & 0xC0000000) == 0xC0000000:
        count += 2
        x <<= 2
    # 检查最高位
    if (x & 0x80000000) == 0x80000000:
        count += 1
    return count

原理:每次判断当前高位段是否全为1,若是则累加对应位数,并将该段左移移出,继续判断剩余高位,逐步缩小范围。

方法2:循环位移法(简单直观)

通过不断左移整数,直到最高位变为0,统计位移次数即可得到前导1的数量。

代码实现:

def count_leading_ones(x):
    if x == 0:
        return 0
    count = 0
    # 以32位无符号整数为例,处理64位则将掩码改为0x8000000000000000
    while x & 0x80000000:
        count += 1
        x <<= 1
    return count

方法3:结合内置函数的位运算方案(简洁)

利用Python内置的bit_length()获取整数二进制位数,再通过位运算推导前导1的数量:

def count_leading_ones(x):
    if x == 0:
        return 0
    bit_len = x.bit_length()
    # 构造掩码,将前导1之后的所有位置为1
    mask = (1 << bit_len) - 1
    # 异或后得到的数的最高位位置就是前导1的结束位置
    return bit_len - (x ^ mask).bit_length()

原理:x ^ mask会把前导1转为0,后续位转为1,其bit_length()的值是第一个0之后的位数,用总位数减去这个值就能得到前导1的数量。

测试验证

用示例中的整数测试:

test_cases = [0,1,2,3,4,5,6,7]
for num in test_cases:
    print(f"整数{num}的连续前导1个数:{count_leading_ones(num)}")

输出结果与示例完全匹配:

整数0的连续前导1个数:0
整数1的连续前导1个数:1
整数2的连续前导1个数:1
整数3的连续前导1个数:2
整数4的连续前导1个数:1
整数5的连续前导1个数:1
整数6的连续前导1个数:2
整数7的连续前导1个数:3

内容的提问来源于stack exchange,提问作者mmore500

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 22:45:56