今天看到《编码:隐匿在计算机软硬件背后的语言》的第十二章:二进制加法器。讲述了全加器,半加器的原理以及如何实现加法。实现加法时所使用的全加器,半加器中包含的所有逻辑门在C语言中都有相应的运算符,就想着能不能利用C语言中的运算符实现不用加号的加法运算。
首先,半加器的样子: 全加器的样子:
二进制加法器的样子:
以下为完全按照二进制加法器的计算流程写成的C语言代码
#include"stdio.h"
int add(int a,int b)
{
,aa,bb,t=;
unsigned i;//由于需要计算31位,但是int的第32位是符号位,故定义成无符号型
;i<=)
{
aa=i&a;//a的本位
bb=i&b;//b的本位
sum|=aa^bb^t;//aa 和 bb 和 前位的进位 求和
t&=aa^bb;//aa 和 bb 的加和位 与 前位的进位 求进位位
t|=aa&bb;//aa 和 bb 的进位位 与 上式的进位位 求或 (如果有进位,上下两个式子只有一个需要进位)
t<<=;
}
return sum;
}
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
printf("%d %d\n",add(a,b),a+b);
;
}
记得以前在网上见到过不使用加号实现加法的方法,于是又从网上找了找。一共找到了三个方法,其中第一种思想与二进制加法器的思想基本相同,但因为不是一位一位运算的,所以有一个地方略有不同,以下为代码
#include"stdio.h"
int add(int a,int b)
{
)
return a;
int sum=a^b;//sum和a存储的是加和位
;//carry和b存储的是进位位
//这里比最开始的代码少了一个求或的运算
//因为这个代码是所有位一起运算的,所以当某一位运算有进位到下一位时
//下一位的两个操作数不会存在都是1的情况
//因为一开始都是1的话,在本次计算之前就已经进位到下一位了
//而最开始的一位一位的计算方法,存在这种情况,所以需要单独处理
return add(sum,carry);
}
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
printf("%d %d\n",add(a,b),a+b);
;
}
第二种第三种方法属于利用计算机内存及函数的运算机制来计算的方法,以下为第二种方法代码
#include"stdio.h"
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
printf("%d\n",printf("%*s%*s",a,"",b,""));
;
//这种方法利用的是printf函数的返回值及*操作符的原理来计算两个数相加的
//1.因为printf函数是字符流的格式化输出函数
// 所以printf函数的返回值是:输出字符串中所含字符个数(int型)
//2.printf函数中的*操作符用来指定输出字符串的宽度
// 这个值由后面对应字符串参数前的一个整数参数指定
//这样在上例中printf输出的字符串是最大宽度为a+b的两个空字符,不足的地方用空格补全
//最终函数的返回值是a+b
//但是这个方法有一个问题:printf函数中的printf函数输出的空格会输出在加和结果之前
//因此这个方法并不能按照正常格式输出a+b
}
以下为第三种方法的代码
#include"stdio.h"
int add(int a,int b)
{
return (int)(&((char*)a)[b]);
//这个求加和的思路是利用数组在内存中存储的连续性
//a[b]与*(a+b)是等价的
//所以要求a+b的值只需求出a[0]到a[b]占内存的宽度除去单个数据所占宽度即可
//具体计算公式:a+b=(int)(&a[b]-&a[0])/sizeof(a[0])
}
int main()
{
int a,b;
while(~scanf("%d%d",&a,&b))
printf("%d %d\n",add(a,b),a+b);
;
}
a+b=a-(-b)这种抖机灵的方法就不提了...
以下为参考
Java实现大数加法运算的几种方法
大数加法 思路一:定义String变量str1和str2分别存储输入的两个大数,定义num1[]和num2[]两个int型数组,将两个字符串分别逐个字符逆序存入数组,定义sum[]数组存放求和结果,使 ...
在shell script中进行数值运算的两种方法
方法1:使用"$((计算式))"的方式进行数值运算,不需要使用declare命令显示声明数值型变量来存储计算结果: 方法2:使用declare命令配合"-i"选 ...
华为OJ机试题目:两个大整数相乘(纯C语言实现两个大整数相乘,两种方法实现大数相乘)
题目描述: 输出两个不超过100位的大整数的乘积. 输入: 输入两个大整数,如1234567 123 输出: 输出乘积,如:151851741 样例输入: 1234567 123 样例输出: 1518 ...
c语言分析函数调用关系图(call graph)的几种方法
一.基于 Doxygen或 lxr 的API形式的文档系统. 二.基于CodeViz, CodeViz是
C#语言————拼接、插入、替换、删除四种方法
StringBuilder sb = new StringBuilder("hello"); sb.Append("world");//拼接 sb.Insert ...
shell 中变获取值及运算的几种方法
num=$(tail ./image/1.txt -n 1) num=$(($num+1))
linux下运算的几种方法
1.expr 1.1 最简单的用法 yan@yan:~$ \* yan@yan:~$ 1.2 bash脚本对于expr yan@yan:~$ cat expr1.sh #!/bin/bash PATH ...
C++大小写转换和性能(C语言,C++,API,STL一共4种方法)
大小写转换和性能 前言 本文主要讨论最基本的一些大小写转换函数和API,不讨论一些常见的字符串程序库里面的大小写转换接口,另外本文的落脚点是这些转换函数的性能和日常开发中遇到的一些问题. 不考虑范围 ...
c语言提取浮点型数据的整数部分与小数部分几种方法
一 前记 最近涉及到把各种传感器的数据通过wifi和bt传输出去,这就涉及到了浮点传输的问题,为了方便传输,笔者的做法一般是把小数和整数部分分开,分别传输,这就比较简单明晰了. 二 方法论 其实,把浮 ...
随机推荐
PHP奇趣笔试试题一则
$a = 3; $b = 5; if($a = 5 || $b = 7){ $a++; $b++; } echo $a, ' ', $b; 输出结果为: A.6 8 B.6 6 C.2 6 D.1 6 ...
[转] 小tips: 使用&;#x3000;等空格实现最小成本中文对齐 ---张鑫旭
by zhangxinxu from http://www.zhangxinxu.com本文地址:http://www.zhangxinxu.com/wordpress/?p=4562 一.重见天日第 ...
Ajax:Cross-Origin Resource Sharing(转)
实例:http://blog.csdn.net/hongweigg/article/details/39054403 通过XHR实现Ajax通信的一个主要限制,来源于跨域安全策略.默认情况下,XHR对 ...
java--List、Set、Map的基础
好像面试很多面试官都喜欢问这它们的一些问题,所以在这里我稍微总结一下,并把大佬们的文章链接贴在后面. 首先我们借鉴了https://www.cnblogs.com/SnowingYXY/p/67273 ...
安装Oracle Grid的过程中用到的几个小技巧
1.利用文件来模拟块设备 在grid的安装教程中有一步是 provision the disk devices for use with ASM Filter Driver.但是如果我们没有多个磁盘怎 ...
C 语言的 GCC 扩展
GNU 编译器(GCC)提供了很多 C 语言扩展,编译器会使用该信息生成更高效的机器代码. 内联函数 static inline __attribute__ ((always_inline)) int ...
python测试开发django-52.xadmin添加自定义的javascript(get_media)
前言 我想使用xadmin在列表页每一行元素添加一个按钮,当点击这个按钮的时候,能发个请求出去,后台执行相关功能.于是想到添加自定义的javascript脚本能实现. 在/stackoverflow上 ...
Django--models--多表操作
一 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一的关 ...
ScrollView嵌套LinearLayout布局不能撑满全屏的问题
当ScrollView里的元素想填满ScrollView时,使用"fill_parent"或者"match_parent"是不管用的,必需为ScrollView ...
linux basic ------ shell
一般习惯把 shell 脚本语言和 shell 解释器统称为 shell,用 shell 脚本语言编写的程序简称脚本. shell 解释器 是用 c 语言写一个应用程序,它是用户使用 Unix / L ...