您的位置:首页 > 编程语言 > C语言/C++

C语言通过逻辑运算(与或非)实现加法

2016-01-13 16:03 489 查看

1.加法器:首先看看下面的内容,了解一下什么是加法器

本部分摘自:http://jpkc.nwpu.edu.cn/dzjc/diangongdz/wangluokecheng/dianzijishu/chapter6/6-6.html

  加法器是计算机中最基本的运算单元电路,任何复杂的加法器电路中,最基本的单元都是半加器和全加器。

  (1)半加器

  半加器只能对一位二进制数作算术加运算,可向高位进位,但不能输入低位的进位值。 半加器的逻辑状态表如表6.5.1。

[align=center]表6.5.1 半加器的逻辑状态表 [/align]
A
B
S
C
0

0

1

1
0

1

0

1
0

1

1

0
0

0

0

1
 逻辑表达式为:
                 


                  


  图6.5.1(a)为用异或门和与门构成的半加器逻辑状态图,图6.5.1(b)为半加器的逻辑符号。



图6.5.1 半加器
 (2)全加器

  表6.5.2是全加器的逻辑状态表,Ai、Bi为本位的加数和被加数,Ci-1表示从低位输入的进位数,Si是本位的和数,Ci为本位输出到高位的进位数。

[align=center]表6.5.2 全加器的逻辑状态表 [/align]










0

0

0

0

1

1

1

1
0

0

1

1

0

0

1

1
0

1

0

1

0

1

0

1
0

1

1

0

1

0

0

1
0

0

0

1

0

1

1

1
 逻辑表达式为:

      


        


        


        


      


 为了利用输出Si,将Ci作适当变换
      


        


  令

,则



的半加和,而Si又是



的半加和,因此可以把一个全加器用两个半加器和一个或门实现,如图6.5.3(a),图6.5.3(b)是全加器的逻辑符号。



图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;

4000
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息