A + B 問題 (簡單介紹位運算)

給出兩個整數 a 和 b , 求他們的和

1.題目

給出兩個整數a和b,求他們的和。

2.思考

a+b,我們不管使用什麼語言a+b都是很容易實現的比如常見的java,該算法可以直接 return (a + b);該算法已經完成。如此簡單肯定不是隻有這樣的,

3.代碼實現:

1.非遞歸實現

    public int aplusb(int a, int b) {
        int carrySum, originalSum;
        //a ^ b 是不進位的原位和
        //a & b 產生進位的地方
        //a & b << 1 是進位和
        //當進位和等於0時,原位和就是a+b的和
        //如果進位和不等於0時,a = 原味和,b = 進位和,繼續按照如上
        //方式進行計算,直到進位和爲0
        while (b != 0){
            carrySum = a ^ b;
            originalSum = (a & b) << 1;
            a = carrySum;
            b = originalSum;
        }
        return a;
    }

2.遞歸實現

    public int aplusb(int a, int b) {
        //遞歸實現
        if (b == 0){
            return a;
        }
        return aplusb((a ^ b),((a & b) << 1));
    }

4.瞭解一下位運算

位運算時對字節或字中的實際位進行檢測、設置或者移位,它只適用於字符型和整數型變量及他們的變體,對其他數據類型不適用

① 、&:位運算邏輯與

邏輯與的運算規則:當進行兩個數的邏輯與運算時,先將他們轉化爲二進制,然後進行邏輯與運算,當相同位的數只有雙方都爲1時結果才爲1,否則爲0

②、 |:位運算邏輯或

邏輯或的運算規則:當進行兩個數的邏輯或運算時,先將兩個數轉化爲二進制,然後進行邏輯或運算,當相同位的數只要有一方爲1結果就爲1,否則爲0

③、 ^: 位運算邏輯異或

邏輯異或運算規則:當進行兩個數的邏輯異或時先將兩個數轉化爲二進制,然後進行邏輯異或運算,當相同位的數只有當雙方都爲不同數字時結果纔是1,否則爲0

④、 ~: 位運算反

邏輯反的運算規則:當進行一個數的邏輯反運算時,先將這個數轉化爲二進制,然後進行邏輯反運算,當數爲1時結果爲0,當數爲0時結果爲1

⑤、 >>: 右移

右移操作運算規則:左邊空出的位用0或者1補,正數用0補,負數用1填補。

當一個數進行n位的右移操作後所得到的新的數=被操作數/2^n

⑥、 <<: 左移

左移運算操作規則:右邊空出的位用0補,高位左移溢出則捨棄該高位。

當一個數進行n位左移操作之後,所得到的新的數=被操作數*2^n

5.位運算加法

1.a^b 是按位相加後沒有進位的和

2.a&b 是產生進位的地方

3.(a&b) << 1 的到進位後的值

4.按位相加後原位和+進位和就是加法的和,依次計算直到進位和爲0之後。

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