我想了解全加法器。我想添加两个int数组0,1,带位操作。但我无法理解如何从两个阵列计算出来。根据维基百科的说法,C在下一个不太重要的阶段有点进展。但是如何从两个int数组中获取它?
int c[sizeof(a)];
for(int i=0; i<sizeof(a); i++) {
c[i] = (a[i] & b[i])
}
这就是我所做的,但我不确定我是否正确行事。
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);
}
这是对的吗?我很困惑。
答案 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;
}