Пытался сделать простой сумматор в C ++. Успешно скомпилирован, но вывод неправильный - PullRequest
0 голосов
/ 29 марта 2019

создал функции NOT, AND, OR и XOR (используя NAND), затем создал функции 'adder_prim' и 'adder_carry' для основного выхода и переноса. Использовали стандартную схему полного сумматора и поместили ее в цикл (10 циклов, чтобы можно было добавить до 2031).

ввел ввод в самом коде (X - 139, Y - 74), чтобы посмотреть, работает ли он правильно.

вместо 216 (правильный ответ) идет 196, и я понятия не имею, почему.


int NAND(int i,int j)
{
    int A;
    A=((i==1)&&(j==1))?0:1;
    return A;
}

int NOT(int i)
{
    int A=NAND(i,i);
    return A;
}

int AND(int i,int j)
{
    int A=NOT(NAND(i,j));
    return A;
}

int OR(int i,int j)
{
    int A=NAND((NAND(i,i)),NAND(j,j));
    return A;
}

int XOR(int i,int j)
{
    int A=OR(AND(i,NOT(j)),AND(NOT(i),j));
    return A;
}

int adder_prim(int,int,int);
int adder_carry(int,int,int);

int _tmain(int argc, _TCHAR* argv[])
{
    int Z[10];
    int C=0;

    int X[]={0,0,1,0,0,0,1,0,1,1};
    int Y[]={0,0,0,1,0,0,1,0,1,0};

    for(int i=0;i<10;i++)
    {
        Z[i]=adder_prim(X[i],Y[i],C);
        C=adder_carry(X[i],Y[i],C);
    }

    for(int j=0;j<10;j++)
    {
        cout <<Z[j];
    }

    getch();
    return 0;
}

int adder_prim(int a,int b,int c)
{
    int O=XOR(XOR(a,b),c);
    return O;
}

int adder_carry(int a,int b,int c)
{
    int C=OR(AND(XOR(a,b),c),AND(a,b));
    return C;
}

1 Ответ

1 голос
/ 29 марта 2019

Сначала необходимо добавить младший значащий бит, а не самый старший бит:

for(int i=9;i>-1;i--)
{
    Z[i]=adder_prim(X[i],Y[i],C);
    C=adder_carry(X[i],Y[i],C);
}
...