添加两个二进制数(整数数组)

adding two binary numbers(integer array)

我完成了这个程序,将存储在一个整数数组中的两个相同长度的二进制数相加,并将总和存储在一个新的整数数组中。但是由于一些逻辑错误,它没有显示所需的输出。

#include <conio.h>
#include <iostream.h>

void main() {
    clrscr();
    int a[] = {1, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 1,
               1, 0, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1};
    int b[] = {1, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1,
               1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0};
    int temp[100];
    int carry = 0, p = 35;
    for(int i = 34; i >= 0; i--) {
        if(a[i] + b[i] + carry == 0) {
            temp[p] = 0;
            carry = 0;
            p--;
        }
        if((a[i] + b[i] + carry) == 1) {
            temp[p] = 1;
            carry = 0;
            p--;
        }
        if((a[i] + b[i] + carry) == 2) {
            temp[p] = 0;
            carry = 1;
            p--;
        }
        if((a[i] + b[i] + carry) > 2) {
            temp[p] = 1;
            carry = 1;
            p--;
        }
    }
    for(int pop = 0; pop < 36; pop++) cout << temp[pop];
    getch();
}

预期输出是:

110100101001100101101010110101011111

实际输出为:

101100110011011101011011101011011111
    if((a[i] + b[i] + carry) == 2) {
        temp[p] = 0;
        carry = 1;
        p--;
    }
    if((a[i] + b[i] + carry) > 2) {
        temp[p] = 1;
        carry = 1;
        p--;
    }

a[i] = 1, b[i] = 1, carry = 0
完成这个 这将在此处触发第一个 if,然后将进位设置为 1。
然后第二个 if 会找到配置 a[i] = 1, b[i] = 1, carry = 1 触发它,尽管原始配置不合适,导致错误。

为了将来,请了解如何使用调试器,或者至少了解如何在程序中包含一些调试控制台打印。设置停止点或打印相应图表中将有节点的位置,以查看流程是否采用正确的路线。
有指纹:

for(int i = 34; i >= 0; i--) {
    cout << "entered loop" << endl;
    if(a[i] + b[i] + carry == 0) {
        temp[p] = 0;
        carry = 0;
        p--;
        cout << "recognized case 1" << endl;
    }
    if((a[i] + b[i] + carry) == 1) {
        temp[p] = 1;
        carry = 0;
        p--;
        cout << "recognized case 2" << endl;
    }
    if((a[i] + b[i] + carry) == 2) {
        temp[p] = 0;
        carry = 1;
        p--;
        cout << "recognized case 3" << endl;
    }
    if((a[i] + b[i] + carry) > 2) {
        temp[p] = 1;
        carry = 1;
        p--;
        cout << "recognized case 4" << endl;
    }
}

(但使用调试器比打印更好。)

您的代码中的问题是您有一组单独的 if 语句,每个语句修改 carry,如果 carry 以这种方式更改以改变结果随后的 if 条语句然后将执行多个 if 条语句体。

简单的解决方法是将最后 3 if 秒更改为 else if

您还需要在输出中添加最后的进位位:

temp[0] = carry;
for(int pop = 0; pop < 36; pop++) cout << temp[pop];

但是,使用 swtich 语句可以大大简化您的代码。更简单的代码通常更少错误并且更容易理解:

for(int i = 34; i >= 0; i--, p--) {
    switch(a[i] + b[i] + carry) {
    case 0:
        temp[p] = 0;
        carry = 0;
        break;
    case 1:
        temp[p] = 1;
        carry = 0;
        break;
    case 2:
        temp[p] = 0;
        carry = 1;
        break;
    case 3:
        temp[p] = 1;
        carry = 1;
        break;
    default:
        // should never be reached with inputs of 0 or 1
        throw std::invalid_argument("invalid input");
    }
}

此代码可以进一步简化,使用位操作删除所有分支并直接设置位,但我将把它留作 reader hint.[=20= 的练习。 ]