如何用C语言模拟4位二进制加法器

如何用C语言模拟4位二进制加法器,c,binary,logic,bit-manipulation,C,Binary,Logic,Bit Manipulation,我的教授让全班同学编写一个C程序,用基本加法器模拟32位加法器。我知道32位加法器是由8×4位加法器组成的。然而,我甚至不确定如何用C语言模拟一个4位加法器。我需要实现一个4位二进制纹波进位加法器、一个4位二进制超前进位生成器和一个4位超前进位加法器。从全加器的真值表和卡诺图中,我得到了求和函数并执行输出。对于Sum,我收到了一个xor B xor进位。对于进位函数,我在xor B中收到了一个*B+进位。现在我不确定该去哪里。我非常确定我需要使用位运算符在位级别操作整数。我有位运算符的基本知识,

我的教授让全班同学编写一个C程序,用基本加法器模拟32位加法器。我知道32位加法器是由8×4位加法器组成的。然而,我甚至不确定如何用C语言模拟一个4位加法器。我需要实现一个4位二进制纹波进位加法器、一个4位二进制超前进位生成器和一个4位超前进位加法器。从全加器的真值表和卡诺图中,我得到了求和函数并执行输出。对于Sum,我收到了一个xor B xor进位。对于进位函数,我在xor B中收到了一个*B+进位。现在我不确定该去哪里。我非常确定我需要使用位运算符在位级别操作整数。我有位运算符的基本知识,尽管我从未在纸和笔之外实现过它们

如何将整数分解以获得函数的A、B和进位输入?如何获得总和并执行输出?如何将全加器串在一起以获得4位加法器


谢谢你的帮助

如果我这样做,我会模拟一个带查找表的4位加法器。在这种情况下,它将是一个256个条目的表,可以像一个16 x 16的值数组一样进行设置

unsigned short outputs[16][16];

multOut = outputs[inA][inB];
您必须初始化数组,但这应该非常简单


使用数组中每个值的第5位作为执行位。

如果我这样做,我会模拟一个带查找表的4位加法器。在这种情况下,它将是一个256个条目的表,可以像一个16 x 16的值数组一样进行设置

unsigned short outputs[16][16];

multOut = outputs[inA][inB];
您必须初始化数组,但这应该非常简单


使用数组中每个值的第5位作为执行位。

好吧,为了得到一个简单的解决方案,我们可以绘制半加器和全加器电路图,并将其抽象一位。来自维基百科:

半加法器:

全加器:


为了安全起见,如果你想的话,你可以把它放在函数调用中。好吧,为了简单的解决方案,我们可以画一个半加器和全加器电路图,并对它进行一点抽象。来自维基百科:

半加法器:

全加器:


为了安全起见,如果要启动,可以将其放入函数调用中。您需要将较大的整数分解为单个位。这将取决于系统的尾数,数字是先存储最多还是先存储最低有效位。一组位掩码会有所帮助。假设是big endian

int bit[]={
             1<<0, //least significant bit
             1<<1, 
             1<<2,
             1<<3
};
在此基础上,您可以使用一些共享数组来存储输出,也可以创建一个简单的结构,如:

struct fullAdderReturn{
       int sum;
       int carryOut;
}

struct fullAdderReturn oneBitAdder(int a, int b, int carryIn)
{
     struct fullAdderReturn output;

     output.sum = a&b;
     output.carryOut = (a&b) | (a&carryIn) | (b&carryIn);

     return output;
}

我在这里组装了一个简单的2位纹波加法器,希望它能给您一些想法。

开始时,您需要将较大的整数分解为单独的位。这将取决于系统的尾数,数字是先存储最多还是先存储最低有效位。一组位掩码会有所帮助。假设是big endian

int bit[]={
             1<<0, //least significant bit
             1<<1, 
             1<<2,
             1<<3
};
在此基础上,您可以使用一些共享数组来存储输出,也可以创建一个简单的结构,如:

struct fullAdderReturn{
       int sum;
       int carryOut;
}

struct fullAdderReturn oneBitAdder(int a, int b, int carryIn)
{
     struct fullAdderReturn output;

     output.sum = a&b;
     output.carryOut = (a&b) | (a&carryIn) | (b&carryIn);

     return output;
}

我在这里组装了一个简单的2位ripple加法器,希望它能给你一些想法。

我没有尝试过任何东西,因为我不知道从哪里开始。不幸的是,如果你的问题是如何将一个整数分解为它的各个位,那么这就是你应该更改标题的地方,我什么都没试过,因为我不知道从哪里开始如果你的问题真的是如何把一个整数分解成它的各个位,那你就应该把你的名字等等改成。太好了,但你刚刚为他们做了一些功课,整体而言。我认为,如果他真的对学习感兴趣,他就不会剽窃。很好,但你刚刚为他们做了全部作业。我认为,如果他真的对学习感兴趣,他就不会剽窃。