算法 A+B

題目: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)

5、右移運算符(>>)

將一個數的各二進制位全部右移若干位,正數左補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;
    }

學習的路上,對別人編碼思路的理解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章