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

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
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是全加器的逻辑状态表,AiBi为本位的加数和被加数,Ci-1表示从低位输入的进位数,Si是本位的和数,Ci为本位输出到高位的进位数。
表6.5.2 全加器的逻辑状态表

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

你可能感兴趣的:(练习/作品)