如何用原始数据类型修改8位数字末位?修复全0输入报错问题
外星飞船信号转换代码修复方案
问题概述
需要处理外星飞船的8位二进制信号流,规则如下:
- 输入中非0/1字符视为噪声
- 首字符为噪声时,翻转信号最后一位;首字符正常时必须为0
- 将处理后的8位二进制转换为十进制数
现有代码使用int读取输入,在输入00000000时存在逻辑问题,且无法处理含噪声的输入场景。
现有代码的问题
- 输入读取错误:用
nextInt()读取会丢失前导零,且遇到非数字字符直接抛出异常,无法处理噪声场景 - 逻辑错误:代码只是将输入的数字拼接成整数,并非将二进制转换为十进制,完全没实现噪声处理规则
- 全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
相关产品推荐
相关产品推荐

