劍指offer42:不用加減乘除做加法
阿新 • • 發佈:2017-08-06
pla -m == spa 都是 cli class offer 十進制
分析:
(1)十進制加法分三步:(以5+17=22為例)
1. 只做各位相加不進位,此時相加結果為12(個位數5和7相加不進位是2,十位數0和1相加結果是1);
2. 做進位,5+7中有進位,進位的值是10;
3. 將前面兩個結果相加,12+10=22
(2)這三步同樣適用於二進制位運算
1.不考慮進位對每一位相加。0加0、1加1結果都是0,0加1、1加0結果都是1。這和異或運算一樣;
2.考慮進位,0加0、0加1、1加0都不產生進位,只有1加1向前產生一個進位。可看成是先做位與運算,然後向左移動一位;
3.相加過程重復前兩步,直到不產生進位為止。
代碼如下:
- // 不用加減乘除做加法
- public int Add(int num1, int num2) {
- int sum = num1 ^ num2;
- int jinwei = (num1 & num2) << 1;
- return jinwei == 0 ? sum : Add(sum, jinwei);
- }
擴展題目:
不使用新的變量,交換兩個變量的值
方法一:基於加減法
- a = a + b;
- b = a - b;
- a = a - b;
方法二:基於異或運算
[cpp] view plain copy- a = a ^ b;
- b = a ^ b;
- a = a ^ b;
劍指offer42:不用加減乘除做加法