【Leetcode371】 Sum of Two Integers

/*任何兩個有符號數,在計算機內部都是用補碼錶示的,特點就是無論是正數還是負數,補碼就按照:
 * 0+0=0, 0+1=1, 1+0=1, 1+1=10這種最樸素的方法計算,最前面的符號位也是如此,同時最前面溢出的就不要了
 * 最後再把補碼變成源碼,就得到了我們認知上的數(計算機內部不需要這一步,補碼就可以了)
 * 考慮未操作的加法,無外乎本位加法,再和進位運算
 * 本位加法:
 * 0+0=0, 0+1=1, 1+0=1, 1+1=0,也就是異或;
 * 進位加法:
 * 0+0=0, 0+1=0, 1+0=0, 1+1=1,也就是與;
 * 計算出來的進位要左移,因爲是要往高位進位,與首尾的符號是正負無關,原因前面已經解釋過了
 * */ 


class Solution {
public:
    int getSum(int a, int b) {
        int local = a^b;
        unsigned int tmp = a&b;
        int count = tmp<<1;//<<是7級,&10級
        if(!count)
            return local;
        else
            return getSum(local, count);
    }
};

關於tmp的作用,因爲a&b結果還是int,有符號數,直接<<可能並不是我們想要的結果,因爲我們想要的實際上是無符號左移,最左邊的符號也要移走。

 

參考了https://www.cnblogs.com/grandyang/p/5631814.html的做法,但我覺得爲了應對<<的問題,他的方法雖然可以通過ob,但是原因不對。

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