1. 程式人生 > >不用任何的算數運算子實現加法

不用任何的算數運算子實現加法

不使用任何算數運算子實現加法

     這裡的算數運算子表示的是 算術運算子 含義(示例) +(加號) 加法運算 (3+3) –(減號) 減法運算 (3–1) 負 (–1) *(星號) 乘法運算 (3*3) /(正斜線) 除法運算 (3/3) %(百分號) 求餘運算10%3=1 (10/3=3·······1) ^(乘方) 乘冪運算 (3^2) ! (階乘) 連續乘法 (3!=3*2*1=6) |X| x為任何數 (絕對值) 求正 (|1|) 我們不使用算數運算子的情況下實現加法,還是有其他的一些演算法的,比如位運算,那我們就看一下位運算的演算法,我們收先考慮或可以嗎? 我們知道或就是不一樣的就是1,那麼有一個問題了對於位運算而言我們只有零和一,對於沒有進位的情況我們的或完美的算出了結果,但是對於有進位的情況怎麼辦呢?有同學要說了,我們有與呀!這裡可以通過與獲得那些有進位的數字位,但是,我們那些進位之後的原位數是零還是一就不確定了。因為我們不知道前面的以為是否有進位,所以我們需要做一個而且我們必須將原來有進位的首先置零才行。所以我們使用這裡的異或,這樣就只留下了不進位的數字位,然後我們通過與算出有進位的數字位,然後進位的數字向左移動一位,接下來,從新計算就好了!
 public int addAB(int A, int B) {
        if (0 == B) {
            return A;
        }
        int sum = A ^ B;
        int carry = (A & B) << 1;
        if (0 == carry) {
            return sum;
        }
        return addAB(sum, carry);
    }

這裡呢!我們第一步傳入  如果 B 是0我們就直接返回A,同樣也是在沒有進位的時候返回A!下面的 0 == carry表示我們第一次進入就沒有進位可以避免二次遞迴。這樣我們就算完了。小猿寫的歡迎斧正!