链接: link
题目
描述
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
1,2
返回:3
思路
这道题不能用常规的加法+来进行计算,那么就需要我们用相应的位运算与操作符运算,而这道题结合递归的思想就可以分两步来进行计算
1.求取两个数相加后当前二进制位的取值(不考虑进位)
2.求取数字相加后进位的取值
3.不断递归运算,直到一个数为0,那么剩下的那个就是相加后的值
这里第一步用到异或运算,第二步两个数进行与运算之后在向左移一位
例子
比如说1和3相加,1的二进制位为00000001,3的二进制位位00000011,先进行第一步 1^3 == 00000001 ^ 00000011 == 00000010 ,接着进行第二步(1&3)<<1 == (00000001 & 00000011)<<1 == 00000010,进行递归处理之后过程为第一步为(00000010 ^ 00000010) == 00000000 , (00000010 & 00000010) << 1 ==00000100 ,这一步中出现了0结果,那么00000100就是相加后的结果4.
代码实现
class UnusualAdd {
public:
int addAB(int A, int B) {
// write code here
if(A == 0)
return B;
if(B == 0)
return A;
int a = A ^ B;
int b = (A&B) << 1;
return addAB(a, b);
}
};