18.1 Write a function that adds two numbers. You should not use + or any arithmetic operators.
這道題讓我們實現兩數相加,但是不能用加號或者其他什么數學運算符號,那么我們只能回歸計算機運算的本質,位操作Bit Manipulation,我們在做加法運算的時候,每位相加之后可能會有進位Carry產生,然后在下一位計算時需要加上進位一起運算,那么我們能不能將兩部分拆開呢,我們來看一個例子759+674
1. 如果我們不考慮進位,可以得到323
2. 如果我們只考慮進位,可以得到1110
3. 我們把上面兩個數字假期323+1110=1433就是最終結果了
然后我們進一步分析,如果得到上面的第一第二種情況,我們在二進制下來看,不考慮進位的加,0+0=0, 0+1=1, 1+0=1, 1+1=0,這就是異或的運算規則,如果只考慮進位的加0+0=0, 0+1=0, 1+0=0, 1+1=1,而這其實這就是與的運算,而第三步在將兩者相加時,我們再遞歸調用這個算法,終止條件是當進位為0時,我們直接返回第一步的結果,參見代碼如下:
int add(int a, int b) { if (b == 0) return a; int sum = a ^ b; int carry = (a & b) << 1; return add(sum, carry); }