1. Problem Description
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example:
Given a = 1 and b = 2, return 3.
什么?你说好简单?输出两个数的和?
2. My solution1(O[n])
class Solution {
public:
int getSum(int a, int b) {
return a+b;
}
};
3. My solution2(位运算O[n])
模拟计算机内部运算加减法的过程 : 以12和22为例
12的二进制表示: 1100
22的二进制表示:10110
①第一层:
首先用异或和,求得不含进位和:
1100^10110=11010
然后两数与,求得两者进位
1100&10110=00100
左移一位,表示进位到下一位。
- >01000
现在我们就得到了这一步的“不含进位和”与“进位数”,再递归传到下一层继续往复计算。
num=11010,carrynext=01000.
②第二层
首先用异或和,求得不含进位和:
11010^01000=10010
然后两数与,求得两者进位
11010&01000=01000
左移一位,表示进位到下一位。
- >10000
现在我们就得到了这一步的“不含进位和”与“进位数”,再递归传到下一层继续往复计算。num=10010,carrynext=10000.
③第三层
10010^10000=00010
10010&10000=10000
- >100000
num=00010,carrynext=100000.
④第四层
00010^100000=100010
00010&100000=000000
- >0000000
num=100010,carrynext=0000000.
至此,carrynext也就是进位为0,我们返回最终结果100010也就是34
class Solution
{
public:
int getSum(int num, int carry)
{
if(carry==0)
return num;
int sum=num^carry;//两数和
int carrynext=(num&carry)<<1;//模拟进位
return getSum(sum,carrynext);
}
};