试图用java程序减去二进制数小错误

时间:2013-09-18 01:45:26

标签: java binary calculator

我做一个简单的加减二进制计算器。我得到它接受一个数字并将其转换为二进制数,我甚至得到它添加数字。当我尝试减去它不起作用。我得到一个奇怪的输出。这是代码的一部分。

int [ ] subtarctBin = new int [16];
int carryX = 0;
for (int i = 0; i < 16; i++)
{
    subtarctBin[i] = 0;
}
for (int i = 15; i >= 0; i--)
{
    int subtract = resultBinA[i] - resultBinB[i] - carryX;
    subtarctBin[i] = subtract % 2;
    carryX = subtract / 2;

}
System.out.println("");
System.out.print("DIF:");
for(int i=0; i<16; i++)
{
    System.out.print(subtarctBin[i]);
}   
 }

4 个答案:

答案 0 :(得分:0)

假设resultBinAresultBinB包含二进制数,问题出现在:

subtarctBin[i] = subtract % 2;

根据Java documentationthe result of the remainder operation can be negative only if the dividend is negative, and can be positive only if the dividend is positive。因此,当subtract等于-1时,subtract % 2也等于-1,因此subtarctBin[i]也将为-1,这不是您想要的。

此外,subtract / 2等于-1,subtract将为Integer division rounds toward 0noted here为{{3}}。

现在,要解决您的问题,请构建此表:

resultBinA resultBinB carryX subtract required subtarctBin required new carryX
         0          0      0        0                    0                   0
         0          0      1       -1                    1                   1
         0          1      0       -1                    1                   1
         0          1      1       -2                    0                   1
         1          0      0        1                    1                   0
         1          0      1        0                    0                   0
         1          1      0        0                    0                   0
         1          1      1       -1                    1                   1

所以,我希望,我们可以看到:

subtarctBin[i] = (subtract + 2) % 2;
carryX = (subtract < 0 ? 1 : 0);

为您提供所需的结果。

答案 1 :(得分:0)

除了@Ken Y-N的回答之外,我发现在这个陈述中,你要从carryX中减去第二个数字。

  int subtract = resultBinA[i] - resultBinB[i] - carryX;

我认为你应该确保第一个数字是两个中较大的一个(即resultBinB&gt; resultBinA),然后减法应该是这样的:

  int subtract =  (resultBinB[i] + carryX) - resultBinA[i];

答案 2 :(得分:0)

尝试

if ((resultBinA[i] - resultBinB[i]) < 0 ){
    int k = i-1;
    while (resultBinA[k] != 1){
        resultBinA[k] = 1;
        k--;
        }
    resultBinA[k] = 0;
    subract = 1;
    }
else{
    subract = (resultBinA[i] - resultBinB[i]);
    }

答案 3 :(得分:0)

我可以给你一个小黑客。

尝试编写一个函数,用1减去二进制数。

然后,创建另一个函数来检查二进制数是否等于0(基本上,如果我们有一个类似“010100”的字符串,我们需要检查每个字符是否为0)。

在你的主函数中,保持减去,直到你的一个数字为0.返回任何不是0.(如果两个数字都是0,则返回0。)

public String sub(String bin2){
        while(!iszero(bin1) && !iszero(bin2)){
            bin1 = subby1(bin1);
            bin2 = subby1(bin2);
        }




        if(!iszero(bin1))
            return bin1;
        else
            return bin2;
    }


    private String subby1(String bin){
        int index = bin.length()-1;

        while(bin.charAt(index) != '1'){
            index--;


        }
        char[] c = bin.toCharArray();
        c[index] = '0';
        for(int x = bin.length()-1; x >= index + 1; x--){
            c[x] = '1';
        }


        return String.valueOf(c);


    }

    private boolean iszero(String bin){
        for(int x = 0; x < bin.length(); x++)
            if(bin.charAt(x) == '1')
                return false;
        return true;
    }
}