分析
首先來理解一下十進位制的加法
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);
}
}