java 給出兩個整數a和b , 求他們的和。不用用運算子+

東豫虯髯發表於2019-01-19

分析

首先來理解一下十進位制的加法
8884 + 146 = 9030
依據 不進位+進位這一思想進行詳述
首先是不進位的結果是8920

哪幾位需要進位呢? 0011 也就是個位和十位需要進位,個位、十位進位之後的值為110,而這個結果是需要加到上面的不進位的值,即8920+110 = 8030 同樣這是沒有進位的,但是在這次相加的過程中也有進位的考量,哪幾位呢?即100,百位的位置需要進位,那就再左移即可,為1000,然後加上上面的不進位相加的和,最後結果是9030,最後再看一下,還需不需要進位呢?發現8030&1000=0(按著二進位制的形式寫的,便於理解),此時是沒有再需要進位的了,即最後結果就是9030了。

下面推廣到二進位制,是同樣的思路的。
來看一下13+7這兩個數的求和過程
13的二進位制表示為:1101
7的二進位制表示為: 0111
先求不進位的兩個數之和,1101^0111 = 1010 ,而哪幾位需要進位呢?
可以用&運算子來確定,即1101 & 0111 = 0101,將此結果左移即是進位之後需要加在1010上面的值,這就有變成剛開始的狀態了,兩個數相加,先算不進位狀態的和,然後再看哪幾位需要進位,上面兩種狀態的值為 0000(不進位的結果) 1010(需要進位,待計算),後面的值再左移表示進位之後的結果為10100,
此時新的兩個數是0000,10100,

public class Solution{
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    public int aplusb(int a, int b) {
        if (b==0) 
            return a;
        return aplusb(a^b, (a&b)<<1);
    }
}

相關文章