链接 http://www.lintcode.com/zh-cn/problem/a-b-problem/
A + B 问题
给出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符。
举两个例子
例子一: 整数 5 和 整数 17
例子二: 整数 20 和 整数 2
需知: 异或运算的运算方式 是 二进制 0 ^ 0 = 0 , 1 ^ 1 = 0 , 0 ^ 1 = 1 , 1 ^ 0 = 1 ; 看完解题步骤 回来看这里 ,就会明白 异或运算 是忽略进位的 加法
与运算的运算方式 是 二进制 0 & 0 = 0 , 1 & 1 = 1, 0 & 1 = 0 , 1 & 0 = 0 ; 与运算是为了计算进位的 结果。 例如 结果 0001 << 1 = 0010 = 2(十进制) ,当进位结果左移一位 仍然是 0000 0000 时 ,意味加法无进位。
解题步骤 :
1. 二进制 5 和 二进制 17 进行 异或运算(^),忽略进位。得出 结果 x1 。含义是 二进制异或运算 计算两个二进制忽略 进位的加法结果。
2. 二进制 5 和 二进制 17 进行 与运算(&),得出结果 再 向左移一位 , 得出结果 x2。 含义是 二进制与运算 计算出 两个二进制数相加 是否出现进位 现象
3. 将结果x1和结果x2相加 就是 两个整数相加的结果。
代码 如下
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) { // write your code here, try to do it without arithmetic operators. if(a==0)return b; if(b==0)return a; int x1 = a^b; int x2 = (a&b)<<1; return aplusb(x1,x2); } };