題目:Write a function that add two numbers A and B.
如果A+B,可以直接 return a+b;實現的話,我想這道題目的意義似乎也就不存在了。
對於實現的過程,先要對位運算做一個瞭解學習。
1、按位與運算符(&)
運算規則:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:兩位同時爲“1”,結果才爲“1”,否則爲0
2、按位或運算符(|)
運算規則:0|0=0; 0|1=1; 1|0=1; 1|1=1;
即 :參加運算的兩個對象只要有一個爲1,其值爲1。
3、異或運算符(^)
運算規則:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:參加運算的兩個對象,如果兩個相應位爲“異”(值不同),則該位結果爲1,否則爲0。
4、左移運算符(<<)
將一個運算對象的各二進制位全部左移若干位(左邊的二進制位丟棄,右邊補0)。
例:a = a<< 2將a的二進制位左移2位,右補0,左移1位後a = a *2;
若左移時捨棄的高位不包含1,則每左移一位,相當於該數乘以2。
實例:0011 (3) << 1 則爲:0110 (6)
將一個數的各二進制位全部右移若干位,正數左補0,負數左補1,右邊丟棄。
操作數每右移一位,相當於該數除以2。
例如:a = a>> 2 將a的二進制位右移2位,左補0 or 補1得看被移數是正還是負。
public static int aplusb(int a, int b) {
// 主要利用異或運算來完成
// 異或運算有一個別名叫做:不進位加法
// 那麼a ^ b就是a和b相加之後,該進位的地方不進位的結果
// 然後下面考慮哪些地方要進位,自然是a和b裏都是1的地方
// a & b就是a和b裏都是1的那些位置,a & b << 1 就是進位
// 之後的結果。所以:a + b = (a ^ b) + (a & b << 1)
// 令a' = a ^ b, b' = (a & b) << 1
// 可以知道,這個過程是在模擬加法的運算過程,進位不可能
// 一直持續,所以b最終會變爲0。因此重複做上述操作就可以
// 求得a + b的值。
while (b != 0) {
int _a = a ^ b;
int _b = (a & b) << 1;
a = _a;
b = _b;
}
return a; // a^0=a;當b=0,則a=a+b;
}
學習的路上,對別人編碼思路的理解。