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

C语言位运算去重打印失败:循环误输出全范围数值

问题分析与修复方案

你的代码存在两个核心问题,导致无法正确记录并去重输出输入值:

  1. 位掩码未累积记录输入:
    定义的buffer每次循环都会被当前输入的x直接覆盖,完全没保留之前输入的数值记录;而且buffer未初始化为0,初始值不确定会引发异常逻辑。

  2. 位运算判断逻辑错误:
    当前的(buffer & z) == z写法无法正确判断某数字是否被输入过,正确的位掩码判断应该是检查对应位是否被置1。


修复后的代码

#include <stdio.h>

int main()
{
    int x = 0;
    // 初始化buffer为0,作为位掩码,每一位对应0-31的数字
    unsigned int buffer = 0;
    int z;
    
    while (1) {
        printf("User input: ");
        scanf("%d", &x);
        // 输入-1时退出循环
        if (x == -1) {
            break;
        }
        // 只处理0-31范围内的有效输入
        if (x >= 0 && x <= 31) {
            // 将对应位设置为1,重复输入不会改变位状态(自动实现去重)
            buffer |= 1 << x;
        }
    }

    // 遍历0-31,检查对应位是否被标记为已输入
    for (z = 0; z <= 31; z++) {
        if ((buffer & (1 << z)) != 0) {
            printf("%d\n", z);
        }
    }
    
    return 0;
}

关键修改说明

  • 位掩码累积记录:用buffer |= 1 << x将输入数字对应的二进制位设为1,重复输入同一个数字时,该位已经是1,不会重复记录,天然实现去重效果。
  • 正确的位判断逻辑:通过buffer & (1 << z)检查第z位是否为1,结果非0则说明该数字被输入过。
  • 输入范围校验:增加0-31的输入判断,避免非法输入干扰位掩码的正确性。
  • 循环逻辑优化:改用while(1)配合break,避免初始x=0可能导致的提前判断问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:30:41