1. 程式人生 > >劍指offer42:不用加減乘除做加法

劍指offer42:不用加減乘除做加法

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.相加過程重復前兩步,直到不產生進位為止

代碼如下:

    1. // 不用加減乘除做加法
    2. public int Add(int num1, int num2) {
    3. int sum = num1 ^ num2;
    4. int jinwei = (num1 & num2) << 1;
    5. return jinwei == 0 ? sum : Add(sum, jinwei);
    6. }

擴展題目:

不使用新的變量,交換兩個變量的值
方法一:基於加減法

[cpp] view plain copy
  1. a = a + b;
  2. b = a - b;
  3. a = a - b;

方法二:基於異或運算

[cpp] view plain copy
    1. a = a ^ b;
    2. b = a ^ b;
    3. a = a ^ b;

劍指offer42:不用加減乘除做加法