我目前正在使用二进制加法器。
寄存器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(正确)
所以,基于这个输入,有谁知道为什么我的代码不起作用?有什么想法吗?
如果您需要我编辑更多代码,我想我可以轻松地做到这一点。如果没有,我会通过评论告诉您需要什么。
感谢您提供任何帮助!
答案 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