从0,1个数组计算运输

时间:2013-10-04 06:09:40

标签: c bit-manipulation bit

我想了解全加法器。我想添加两个int数组0,1,带位操作。但我无法理解如何从两个阵列计算出来。根据维基百科的说法,C在下一个不太重要的阶段有点进展。但是如何从两个int数组中获取它?

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

这就是我所做的,但我不确定我是否正确行事。

Adding binary numbers in 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); 
 }

我理解其余部分,但答案并未显示如何获得... ...有人可以帮助我吗?提前谢谢。

添加

// 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);
}

这是对的吗?我很困惑。

2 个答案:

答案 0 :(得分: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 !

答案 1 :(得分:-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)

如果满足上述条件,则有一个进位进位。否则重置它。

编辑

全加器代码

#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;
}