为什么我的二进制输出与预期输出不同?

时间:2018-09-13 23:23:16

标签: c

我的代码有问题,无法提供正确的输出。例如,我正在尝试进行二进制减法。第一个测试用例假设要测试0x00CD - 0x00AB,正确的输出是00000000001000100x0022)。我正在得到00000000011001100x0066)的输出,它的输出减少了几位数。有人可以帮我调试我的问题吗?

#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;
}

1 个答案:

答案 0 :(得分:1)

您的借用代码逻辑已损坏。当x[i]大于y[i]并且i不是n-1时,您将进入此代码,以寻找非零的x[j]来借用。但是索引较高的x[j]已经被操作了(因为i从15到0)。您不应该向他们借钱。

通常,减法从低位到高位(i从0到15)进行。然后,如果需要借入,我们就像借入一样计算当前数字,设置一个计数器或标志以记住我们借入的内容,然后继续到下一个数字,将借入合并到计算中。

或者,如果从高到低工作,那么当需要借位时,我们需要从先前计算的数字(在difference中)中获取,而不要从被减数(x)中获取。 。 (并且该代码必须警惕高端运行。)