二进制加法代码自测正常却被判定无效,请求排查错误
二进制小端加法方法的错误排查
我完成了一个实现二进制数相加的作业,采用小端(little-endian)格式计算,自测不同输入都能得到正确结果,但老师判定方法无效。以下是相关代码及测试用例,帮忙指出错误所在:
public void add(BinaryNumber aBinaryNumber) { //Creating local variables for storing carry value and temporal sum array int carry = 0; int[] temp = new int[data.length]; if(data.length != aBinaryNumber.getLength()) { //Checking if length of two binary numbers are coincide System.out.println("Lengths of binary numbers do not coincide."); } else { //populating temporary array after sum for(int i=0; i< data.length; i++) { if((data[i] + aBinaryNumber.getDigit(i) + carry) == 0 ) { temp[i] = 0; carry=0; } else if((data[i] + aBinaryNumber.getDigit(i) + carry) == 1 ) { temp[i] = 1; carry=0; } else if((data[i] + aBinaryNumber.getDigit(i) + carry) == 2 ) { if(i==(data.length - 1)) { //Setting overflow flag to true, if there is a carryover digit at the addition overflow = true; break; } temp[i] = 0; carry=1; } else if((data[i] + aBinaryNumber.getDigit(i) + carry) == 3 ) { if(i==(data.length - 1)) { overflow = true; break; } temp[i] = 1; carry=1; } } if(carry == 1) { System.out.println("Sum resulted overflow."); } } data = temp; } public static void main(String[] args) { //All calculations made using little-endian format. BinaryNumber data1 = new BinaryNumber("1011");// decimal 13 BinaryNumber data2 = new BinaryNumber("0100");// decimal 2 BinaryNumber data5 = new BinaryNumber("1110");// decimal 7 BinaryNumber data6 = new BinaryNumber("1011");// decimal 13 //Performing addition operation with two binary numbers. data1.add(data2);// result 1111, decimal 15 data5.add(data6);// sum resulted overflow //Clearing overflow flag data5.clearOverflow(); //Performing addition of two binary numbers that have different length data1.add(data3); //addition of two binary numbers that have different length }
错误点分析
长度不匹配时的非法赋值:当两个二进制数长度不一致时,代码仅打印提示,但依然执行
data = temp,将当前对象的data数组替换为未赋值的空数组(temp初始化后未被修改),直接导致原有数据丢失。正确逻辑应该是长度不匹配时直接返回,跳过后续赋值操作。溢出处理逻辑混乱:
- 当处理最后一位(小端的最高位)相加和为2或3时,设置
overflow=true后直接break循环,此时该位的计算结果未写入temp数组,且后续carry=1的情况也无法被处理,导致temp数组最后一位数据错误。 - 循环结束后若
carry=1,仅打印溢出提示但未设置overflow标志,导致溢出状态未被正确记录,与clearOverflow方法的调用逻辑矛盾。
- 当处理最后一位(小端的最高位)相加和为2或3时,设置
小端存储的理解与实现不符:测试用例注释中,
BinaryNumber("1011")标注为十进制13,但小端存储下,字符串"1011"应对应最低位在数组索引0,即数值为1*2^0 + 1*2^1 + 0*2^2 +1*2^3=11而非13。这说明BinaryNumber构造函数可能按大端存储字符串,但你的add方法按小端逻辑计算,导致实际计算的数值与预期不符,这是老师判定无效的核心原因之一。测试代码存在编译错误:
main方法中调用data1.add(data3),但data3未定义,会直接导致编译失败。
内容的提问来源于stack exchange,提问作者Fez
相关产品推荐
相关产品推荐

