鏈接 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); } };