0

我试图理解全加器。我想通过位操作添加两个 0、1 的 int 数组。但我不明白如何从两个数组计算马车。根据维基百科,C 是从下一个不太重要的阶段引入的。但是我如何从两个 int 数组中得到它呢?

int c[sizeof(a)];
for(int i=0; i<sizeof(a); i++) {
    c[i] = (a[i] & b[i])
}

这就是我所做的,但我不确定我是否做对了。

在 C++ 中添加二进制数

 for(i = 0; i < 8 ; i++){
      sum[i] = ((a[i] ^ b[i]) ^ c); // c is carry
      c = ((a[i] & b[i]) | (a[i] & c)) | (b[i] & c); 
 }

我理解其余的,但答案没有显示如何获得 c... 有人可以帮助我吗?提前致谢。

添加

// sum = a xor b
// carriage_in = a and b

// carriage_out = a xor b xor carriage_in
// sum = a xor b xor carriage_out

for(int i=0; i<8; i++) {
    int carriage = (a[i] & b[i]);
    sum[i] = ((a[i] ^ b[i]) ^ carriage);
    carriage = ((a[i] & b[i]) | (a[i] & carriage)) | (b[i] & carriage);
}

它是否正确?我感到很困惑。

4

2 回答 2

0

您提供的最后一个代码示例几乎是正确的,实际上它的问题比@Gangadhar 接受的答案要少。您只需要进行一些更改即可使进位标志的初始状态正确:

int carriage = 0;                     // init carry in
for (int i=0; i<8; i++) {
    sum[i] = a[i] ^ b[i] ^ carriage;  // half add - you got this part right !
    carriage = (a[i] & b[i]) | (a[i] & carriage) | (b[i] & carriage);
                                      // generate new carry - you got this
}                                     // part right also !
于 2013-10-04T10:43:01.670 回答
-1

全加器是 1 位加法器。

如果您想添加存储在两个数组中的单个位。

为此,您需要Bit wise OR在两个数组元素之间使用操作。并携带位

如果任何两个carry,a[i] and b[i]变为 1。

(carry==1 and a[i]==1) or (carry==1 and b[i]==1) or (a[i]==1 and b[i]==1).

如果上述条件满足,则有一个 carry.set 进位,否则将其重置。

编辑

全加器代码

#include<stdio.h>

int main()
{
    int a[4]={1,1,0,1};
    int b[4]={1,0,0,1};
    int sum[5];
    int car=0;
    int i=0;

    for(i=3;i>=0;i--)
    {
        sum[i+1]=a[i]^ b[i] ^ car ;
        car=(a[i]&b[i])|(a[i]&car)|(b[i]& car);
        printf("%d=%d\n",sum[i+1],car);
    }
    sum[0]=car;


    printf("The result is: ");
    for(i=0;i<5;i++)
    printf("%d",sum[i]);
    printf("\n");

    return 0;
}
于 2013-10-04T06:25:48.330 回答