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

如何用原始数据类型修改8位数字末位?修复全0输入报错问题

外星飞船信号转换代码修复方案

问题概述

需要处理外星飞船的8位二进制信号流,规则如下:

  • 输入中非0/1字符视为噪声
  • 首字符为噪声时,翻转信号最后一位;首字符正常时必须为0
  • 将处理后的8位二进制转换为十进制数

现有代码使用int读取输入,在输入00000000时存在逻辑问题,且无法处理含噪声的输入场景。

现有代码的问题

  1. 输入读取错误:用nextInt()读取会丢失前导零,且遇到非数字字符直接抛出异常,无法处理噪声场景
  2. 逻辑错误:代码只是将输入的数字拼接成整数,并非将二进制转换为十进制,完全没实现噪声处理规则
  3. 全0输入问题:虽然00000000能被解析为0,但后续计算没有按规则处理,且本质逻辑不符合需求

修复后的代码(仅用原始数据类型)

import java.util.Scanner;

public class AlienSignalHandler {
    public static void main(String[] args) {
        Scanner inp = new Scanner(System.in);
        String inputStr = inp.next();
        // 初始化8位二进制数组,默认填充0,保证长度固定为8
        char[] signalBits = new char[8];
        for (int i = 0; i < 8; i++) {
            signalBits[i] = '0';
        }

        // 把输入内容填充到数组(最多取前8位)
        int validLength = Math.min(inputStr.length(), 8);
        for (int i = 0; i < validLength; i++) {
            signalBits[i] = inputStr.charAt(i);
        }

        // 判断首字符是否为噪声
        boolean hasLeadingNoise = !(signalBits[0] == '0' || signalBits[0] == '1');
        // 首字符正常时强制设为0
        if (!hasLeadingNoise) {
            signalBits[0] = '0';
        }

        // 首字符是噪声则翻转最后一位
        if (hasLeadingNoise) {
            signalBits[7] = (signalBits[7] == '0') ? '1' : '0';
        }

        // 将处理后的二进制转换为十进制(用int类型计算)
        int decimalValue = 0;
        for (char bit : signalBits) {
            // 非0/1的噪声位视为0
            int currentBit = (bit == '1') ? 1 : 0;
            decimalValue = decimalValue * 2 + currentBit;
        }

        System.out.println(decimalValue);
    }
}

关键修复说明

  • 输入处理:改用字符串读取输入,保留所有字符(包括前导零和噪声),避免整数解析的局限性
  • 噪声处理:校验首字符是否为有效0/1,标记后对应翻转最后一位,操作仅用字符和布尔值等原始类型
  • 二进制转十进制:按二进制权重计算,正确转换为十进制数,噪声位统一视为0
  • 全0输入兼容:初始化数组为全0,输入00000000时直接处理为二进制0,输出十进制0,无任何报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:01:29