我做一个简单的加减二进制计算器。我得到它接受一个数字并将其转换为二进制数,我甚至得到它添加数字。当我尝试减去它不起作用。我得到一个奇怪的输出。这是代码的一部分。
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]);
}
}
答案 0 :(得分:0)
假设resultBinA
和resultBinB
包含二进制数,问题出现在:
subtarctBin[i] = subtract % 2;
根据Java documentation,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,这不是您想要的。
此外,subtract / 2
等于-1,subtract
将为Integer division rounds toward 0
,noted 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;
}
}