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 半加器 |
表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; }
相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C语言自动生成enum值和名字映射代码
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中计算正弦的相关函数总结
- 使用C语言详解霍夫曼树数据结构
- 探讨C语言的那些小秘密之断言
- C语言实现BMP转换JPG的方法
- 深入探讨C语言中局部变量与全局变量在内存中的存放位置
- C语言查找数组里数字重复次数的方法