我的代码有问题,无法提供正确的输出。例如,我正在尝试进行二进制减法。第一个测试用例假设要测试0x00CD - 0x00AB
,正确的输出是0000000000100010
(0x0022
)。我正在得到0000000001100110
(0x0066
)的输出,它的输出减少了几位数。有人可以帮我调试我的问题吗?
#include <stdio.h>
int main(void)
{
int borrow, i, j;
int x[16] = {0}, y[16] = {0}, difference[16] = {0};
int n= 16;
unsigned int hex1, hex2;
scanf("%x %x", &hex1, &hex2);
i = 0;
while (hex1 != 0)
{
x[i] = hex1 % 2;
hex1 = hex1 / 2;
i = i + 1;
}
i = 0;
while (hex2 != 0)
{
y[i] = hex2 % 2;
hex2 = hex2 / 2;
i = i + 1;
}
borrow = 0;
for (i = 15; i >= 0; i--)
{
if(y[i] <= x[i])
{
difference[i] = (x[i] - y[i]);
}
else if (i == n - 1)
{
borrow = 1;
x[i] = x[i] + 2;
difference[i] = (x[i] - y[i]);
}
else
{
j = i + 1;
while (x[j] == 0)
{
j = j + 1;
}
x[j] = x[j] - 1;
j = j - 1;
while (j > i)
{
x[j] = x[j] + 2 - 1;
j = j - 1;
}
difference[i] = (2 + x[i] - y[i]);
}
}
for (i = 15; i >= 0; i--)
printf("%d", difference[i]);
return 0;
}
答案 0 :(得分:1)
您的借用代码逻辑已损坏。当x[i]
大于y[i]
并且i
不是n-1
时,您将进入此代码,以寻找非零的x[j]
来借用。但是索引较高的x[j]
已经被操作了(因为i
从15到0)。您不应该向他们借钱。
通常,减法从低位到高位(i
从0到15)进行。然后,如果需要借入,我们就像借入一样计算当前数字,设置一个计数器或标志以记住我们借入的内容,然后继续到下一个数字,将借入合并到计算中。
或者,如果从高到低工作,那么当需要借位时,我们需要从先前计算的数字(在difference
中)中获取,而不要从被减数(x
)中获取。 。 (并且该代码必须警惕高端运行。)