1

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

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

4 回答 4

0

假设resultBinAresultBinB包含二进制数,问题就在这里:

subtarctBin[i] = subtract % 2;

根据Java 文档the 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,这不是你想要的。

此外,当等于 -1时,subtract / 2将产生 0 ,如,如此处所述subtractInteger division rounds toward 0

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

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);

为您提供所需的结果。

于 2013-09-18T01:59:23.680 回答
0

除了@Ken YN 的回答,我发现在这个语句中,你是从第二个数字中减去第一个数字以及进位X。

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

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

  int subtract =  (resultBinB[i] + carryX) - resultBinA[i];
于 2013-09-18T02:20:05.737 回答
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]);
    }
于 2013-09-18T02:25:50.843 回答
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;
    }
}
于 2015-12-08T20:28:46.630 回答