^ 亦或 ----相當於 無進位的求和, 想象10進制下的模擬情況:(如:19+1=20;無進位求和就是10,而非20;因爲它不管進位情況)
& 與 ----相當於求每位的進位數, 先看定義:1&1=1;1&0=0;0&0=0;即都爲1的時候才爲1,正好可以模擬進位數的情況,還是想象10進制下模擬情況:(9+1=10,如果是用&的思路來處理,則9+1得到的進位數爲1,而不是10,所以要用<<1向左再移動一位,這樣就變爲10了);
這樣公式就是:(a^b) ^ ((a&b)<<1) 即:每次無進位求 + 每次得到的進位數--------我們需要不斷重複這個過程,直到進位數爲0爲止;
https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof/
寫一個函數,求兩個整數之和,要求在函數體內不得使用 “+”、“-”、“*”、“/” 四則運算符號。
class Solution {
public:
int add(int a, int b) {
while(b != 0){
int temp = (a ^ b);//無進位相加
b = (unsigned int)(a & b) << 1; //進位,注意:C++不支持負值左移!!這裏要加上unsigned int
a = temp;
}
return a;
}
};