/*任何兩個有符號數,在計算機內部都是用補碼錶示的,特點就是無論是正數還是負數,補碼就按照:
* 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,但是原因不對。