您的位置:首页 > 其它

【刷题算法】不用+运算符求加法

2016-02-27 17:20 302 查看
题目来自于lintcode 第1题 A+B问题:

题目如下:

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

一般数值进行加法,比如两个数,A=9,B=7。

当进行十进制加法的时候,

1. 先算各个位数,

2. 然后得到进位,

3. 最终将进位加上前一位。

由于不用加运算符,只能从位运算进行入手。由于我的自动化专业相关,立刻想到微机原理中的 加法器 。

下图为半加器:



图上S为各个位数相加后的结果(不进位),C为进位

半加器的真值表如下:

A B S C

0 0 0 0

0 1 1 0

1 0 1 0

1 1 0 1

我们把十进制A=9和A=7分别化为二进制 A=1001,B=0111。

我们按照十进制的思路进行运算

1. 先算各个位数(不进位),则1001 + 0111 = 1110

其结果就像是A^B,(A异或B)

2. 然后得到进位。 1001+0111 若进行进位,只有当1 + 1的时候会出现进位,那么如何得到进位信号呢? 我们看,1+1 出现进位信号,1+0,0+0,0+1不会出现进位信号,其满足 相与& 的真值表,我们也可以从半加器的内部中直接看出,S=A^B, C=A&B

3. 加上进位。那么如何加上进位,我们发现1+1的时候(1&1=1)出现进位信号,但是进位信号是要进位的,也就是进上前一位,我们用<<符号进行移位。

* *即可以把C进一步表示为C=(A&B)<<1;

由于如果前一位位0+1,加上进位符号1,则也会进位,所以要进行不断的重复上述过程。

算法代码如下:

class Solution {
public:
/*
* @param a: The first integer
* @param b: The second integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
if(a==0) return b;
if(b==0) return a;
int s,c; //s为加法sum, c为进位carry
s=a^b; //半加器实现低位
c=(a&b)<<1;//高位
return aplusb(s,c);
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: