1.加法器:首先看看下面的内容,了解一下什么是加法器
本部分摘自:http://jpkc.nwpu.edu.cn/dzjc/diangongdz/wangluokecheng/dianzijishu/chapter6/6-6.html加法器是计算机中最基本的运算单元电路,任何复杂的加法器电路中,最基本的单元都是半加器和全加器。
(1)半加器
半加器只能对一位二进制数作算术加运算,可向高位进位,但不能输入低位的进位值。 半加器的逻辑状态表如表6.5.1。
|
表6.5.1 半加器的逻辑状态表
| |||
|
A |
B |
S |
C |
|
0 |
0 |
0 |
0 |
图6.5.1(a)为用异或门和与门构成的半加器逻辑状态图,图6.5.1(b)为半加器的逻辑符号。
![]() 图6.5.1 半加器 |
表6.5.2是全加器的逻辑状态表,Ai、Bi为本位的加数和被加数,Ci-1表示从低位输入的进位数,Si是本位的和数,Ci为本位输出到高位的进位数。
|
表6.5.2 全加器的逻辑状态表
| ||||
|
|
|
|
|
|
|
0 |
0 |
0 |
0 |
0 |
为了利用输出Si,将Ci作适当变换
令

图6.5.3 全加器
2.代码
利用上面的公式,可以得到以下代码(可加可减,可正可负,因为负数就是补码,用负数就是减法了)。至于效率,其实都是你懂的,就是看着好玩……
int func(int x, int y)
{
int a, b , c, s;
int tmp, flag;
s = c = tmp = 0;
flag = 1;
for(int i = 0; i < 32 ; i++)
{
a = x & flag;
b = y & flag;
s = a ^ b ^ c;
c = (a & b)<< 1;
tmp |= s;
flag <<= 1;
}
return tmp;
}其实上面的代码还是用到了加法,i++,不过这里保留着的目的是为了做看着舒服一点,而且如果是用来做较大数字加法也容易修改。强迫症犯了可以改成这样
int func(int x, int y)
{
int a, b , c, s;
int tmp, flag;
s = c = tmp = 0;
flag = 1;
while(1){
a = x & flag;
b = y & flag;
s = a ^ b ^ c;
c = (a & b)<< 1;
tmp |= s;
if(flag & 0x80000000 == 0x80000000)
break;
flag <<= 1;
}
return tmp;
}
本文介绍了如何使用C语言中的逻辑运算(与或非)来实现加法操作,包括正数、负数以及加减法的转换。通过理解加法器的概念,作者提供了相应的代码实现,虽然效率不高,但具有趣味性。






841

被折叠的 条评论
为什么被折叠?



