題目:
給出兩個(gè)整數(shù)a和b, 求他們的和, 但不能使用 + 等數(shù)學(xué)運(yùn)算符
注意事項(xiàng):
你不需要從輸入流讀入數(shù)據(jù),只需要根據(jù)aplusb的兩個(gè)參數(shù)a和b,計(jì)算他們的和并返回就行籍救。
說明:
a和b都是32位整數(shù)编矾,可以使用位運(yùn)算符
樣例:
如果 a=1并且 b=2圣蝎,返回3
代碼:
class Solution {
/*
* param a: The first integer
* param b: The second integer
* return: The sum of a and b
*/
public int aplusb(int a, int b) {
// 主要利用異或運(yùn)算來完成
// 異或運(yùn)算有一個(gè)別名叫做:不進(jìn)位加法
// 那么a ^ b就是a和b相加之后话瞧,該進(jìn)位的地方不進(jìn)位的結(jié)果
// 然后下面考慮哪些地方要進(jìn)位,自然是a和b里都是1的地方
// a & b就是a和b里都是1的那些位置唬涧,a & b << 1 就是進(jìn)位
// 之后的結(jié)果譬正。所以:a + b = (a ^ b) + (a & b << 1)
// 令a' = a ^ b, b' = (a & b) << 1
// 可以知道宫补,這個(gè)過程是在模擬加法的運(yùn)算過程,進(jìn)位不可能
// 一直持續(xù)曾我,所以b最終會變?yōu)?粉怕。因此重復(fù)做上述操作就可以
// 求得a + b的值。
while (b != 0) {
int _a = a ^ b;
int _b = (a & b) << 1;
a = _a;
b = _b;
}
return a;
}
}
總結(jié):
題目略微有些抽象抒巢,實(shí)際上就是將a 和 b 的二進(jìn)制位相加贫贝,_a代表不考慮進(jìn)位的二進(jìn)制和,
_b代表單單是只有進(jìn)位處值的和蛉谜,當(dāng)_b為0時(shí)意味著此時(shí)的_a已經(jīng)是a + b的和
之所以要重復(fù)加的原因是當(dāng)前進(jìn)位加完可能還會有新的進(jìn)位