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

二进制加法代码自测正常却被判定无效,请求排查错误

二进制小端加法方法的错误排查

我完成了一个实现二进制数相加的作业,采用小端(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初始化后未被修改),直接导致原有数据丢失。正确逻辑应该是长度不匹配时直接返回,跳过后续赋值操作。

  • 溢出处理逻辑混乱:

    1. 当处理最后一位(小端的最高位)相加和为2或3时,设置overflow=true后直接break循环,此时该位的计算结果未写入temp数组,且后续carry=1的情况也无法被处理,导致temp数组最后一位数据错误。
    2. 循环结束后若carry=1,仅打印溢出提示但未设置overflow标志,导致溢出状态未被正确记录,与clearOverflow方法的调用逻辑矛盾。
  • 小端存储的理解与实现不符:测试用例注释中,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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:05:22