題目描述
寫一個(gè)函數(shù)茄蚯,求兩個(gè)整數(shù)之和瞳遍,要求在函數(shù)體內(nèi)不得使用+闻妓、-、*掠械、/四則運(yùn)算符號由缆。
題解一
在十進(jìn)制中,我們使用三步走的方法來做加法(以5和7為例子):
- 各位相加而不進(jìn)位(得到2)猾蒂。
- 計(jì)算進(jìn)位值(得到10)均唉。
- 將前兩步得到的結(jié)果相加(得到12)。
在二進(jìn)制中肚菠,我們也可以模擬這種方法來做加法(同樣以5(101)和7(111)為例子):
- 各位相加而不進(jìn)位(得到sum=010)舔箭,可用異或操作。
- 計(jì)算進(jìn)位值(得到carry=1010)蚊逢,可用與操作后左移一位层扶。
- 將前兩步得到的結(jié)果相加,即循環(huán)前兩步(令num1=sum, num2=carry然后循環(huán))时捌,當(dāng)carry=0時(shí)終止循環(huán)怒医。
下面是參考代碼:
class Solution {
public int add(int a, int b) {
int sum = 0, carry = 0;
while (true) {
sum = a ^ b;
carry = (a & b) << 1;
if (carry == 0) break;
a = sum;
b = carry;
}
return sum;
}
}
題解二
使用上面的思路,還可以改為更簡潔的遞歸實(shí)現(xiàn)奢讨,添加遞歸出口即可稚叹。
下面是參考代碼:
class Solution {
public int add(int a, int b) {
if (a == 0) return b;
if (b == 0) return a;
return add(a ^ b, (a & b) << 1);
}
}