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

9位二进制输入:判断1的数量为0的一半,求无计数器解法

无需计数器的实现方案

嘿,这个问题其实可以先从数学层面拆解一下,反而能找到绕开计数器的捷径!

首先咱们先明确核心条件:输入是固定9位的二进制代码,设其中1的数量为x,0的数量就是9 - x。题目要求的触发条件是1的数量是0的数量的一半,把这个转化为方程就是:

x = (9 - x) / 2

解这个方程很简单:

  • 两边乘2得到:2x = 9 - x
  • 移项后:3x = 9 → x = 3

哦!原来问题等价于:判断输入的9位二进制中是否恰好有3个1。满足这个条件就输出"0",否则输出"1"。这样一来,我们就不用逐个统计1的数量,而是可以利用位运算或者固定位数的特性来实现。

方法1:并行位运算计数(无循环计数器)

这种方法利用位运算的并行性,批量计算二进制中1的个数,全程不需要手动维护一个计数变量:

def judge_binary(b):
    # 输入b是9位二进制对应的整数(范围0~511)
    # 第一步:每两位一组计算1的个数
    c = b - ((b >> 1) & 0x15555555)
    # 第二步:每四位一组累加1的个数
    c = (c & 0x33333333) + ((c >> 2) & 0x33333333)
    # 第三步:每八位一组累加1的个数
    c = (c + (c >> 4)) & 0x0F0F0F0F
    # 因为是9位,取低两位的和得到总1的个数
    total_ones = (c + (c >> 8)) & 0x3F
    # 判断是否恰好3个1
    return "0" if total_ones == 3 else "1"

方法2:预生成合法值集合(更直观)

因为9位二进制中恰好3个1的情况是固定的(总共C(9,3)=84种),我们可以预先生成所有符合条件的数值,然后直接判断输入是否在这个集合里:

from itertools import combinations

# 预生成所有恰好3个1的9位二进制对应的整数
valid_numbers = set()
for bit_positions in combinations(range(9), 3):
    num = 0
    for pos in bit_positions:
        num |= 1 << pos
    valid_numbers.add(num)

def judge_binary(b):
    return "0" if b in valid_numbers else "1"

这两种方法都不需要手动写循环去逐个统计1的数量,完美符合你要的"无需计数器"的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:09:53