二进制加法器仅在大多数情况下工作*

时间:2015-11-25 20:08:57

标签: c binary add

我目前正在使用二进制加法器。

寄存器A和B是输入寄存器。它们存储为双向链表。寄存器S用于输出。 (对于真值表)

这是提供的真值表:

A | B | CarryIn | S | CARRYOUT

0 | 0 | 0 | 0 | 0

0 | 0 | 1 | 1 | 0

0 | 1 | 0 | 1 | 0

0 | 1 | 1 | 0 | 1

1 | 0 | 0 | 1 | 0

1 | 0 | 1 | 0 | 1

1 | 1 | 0 | 0 | 1

1 | 1 | 1 | 1 | 1

这是保存指针的结构(CPU)以及其他数据:

struct cpu_t
{
        int word_size; 
        int unsign; 
        int overflow; 
        int carry;
        int sign;
        int parity;
        int zero;
        struct bit_t *r1_head;
        struct bit_t *r1_tail;
        struct bit_t *r2_head;
        struct bit_t *r2_tail;
        struct bit_t *r3_head;
        struct bit_t *r3_tail;
};

这是我的添加功能:

void add_function(struct cpu_t *cpu)
{
    int i = 0;

    struct bit_t *temp1 = cpu->r1_tail;
    struct bit_t *temp2 = cpu->r2_tail;
    struct bit_t *temp3 = cpu->r3_tail;

    while(i < (cpu->word_size))
    {
        if(temp1->n == 0 && temp2->n == 0 && cpu->carry == 0)
        {
            temp3->n = 0;   
            cpu->carry = 0;
        }
        else if(temp1->n == 0 && temp2->n == 0 && cpu->carry == 1)
        {
            temp3->n = 1;   
            cpu->carry = 0;
        }
        else if(temp1->n == 0 && temp2->n == 1 && cpu->carry == 0)
        {
            temp3->n = 1;   
            cpu->carry = 0;
        }
        else if(temp1->n == 0 && temp2->n == 1 && cpu->carry == 1)
        {
            temp3->n = 0;   
            cpu->carry = 1;
        }
        else if(temp1->n == 1 && temp2->n == 0 && cpu->carry == 0)
        {
            temp3->n = 1;   
            cpu->carry = 0;
        }
        else if(temp1->n == 1 && temp2->n == 0 && cpu->carry == 1)
        {
            temp3->n = 0;   
            cpu->carry = 1;
        }
        else if(temp1->n == 1 && temp2->n == 1 && cpu->carry == 0)
        {
            temp3->n = 0;   
            cpu->carry = 1;
        }
        else if(temp1->n == 1 && temp2->n == 1 && cpu->carry == 1)
        {
            temp3->n = 1;   
            cpu->carry = 1;
        }

        temp1 = temp1->prev;
        temp2 = temp2->prev;
        temp3 = temp3->prev;
        i++;
    }
}

以下是一些示例输出,用于显示我遇到的问题:

word_size为2:

01 + 01 = 10(正确)

word_size为4:

0111 + 0001 = 1001(错误)

word_size为8:

10101010 + 01010101 = 11111111(正确)

11101101 + 01101000 = 01010110(不正确,实际为01010101)

word_size为4:

1001 + 0110 = 1111(正确)

1111 + 1111 = 1110(正确)

所以,基于这个输入,有谁知道为什么我的代码不起作用?有什么想法吗?

如果您需要我编辑更多代码,我想我可以轻松地做到这一点。如果没有,我会通过评论告诉您需要什么。

感谢您提供任何帮助!

1 个答案:

答案 0 :(得分:0)

OP的测试用例期望cpu->carry在执行void add_function(struct cpu_t *cpu)void addc_function(struct cpu_t *cpu) { // existing code } void add_function(struct cpu_t *cpu) { cpu->carry = 0; addc_function(cpu); } 为0。

看起来OP应该有2个添加功能并相应地使用。

html