不用加减乘除做加法

1.本题知识点

   进制转化,发散思维能力

2. 题目描述

   写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
                    

3. 思路

   总体思路:利用二进制位运算进行相加操作。
   首先,先看十进制是如何计算加法。比如5 + 17,
   ① 相加各位的值,不做进位,得05 + 17 = 12;
   ②计算进位值,得10;
   ③将第一步和第二步的结果相加,得 12 + 10 = 22,即为5+17的值。
   所以,二进制也采用此方式相加。5的二进制为101,17的二进制为 10001。
   ① 相加各位的值,不做进位,10001 + 101 = 10100;
   ② 计算进位值,得10;
   ③ 将前两步相加得,10100 + 10 = 10110,十进制刚好是22.
   继续分析,第一步,不产生进位相加,0 + 0 = 0,1 + 1 = 0,1 + 0 = 1,0 + 1 = 1,即相同为0,不同为1,就是按位异或操作,10001 ^ 00101 = 10100。
   第二步,只有当 位运算1 + 1时才会产生进位,我们可以看出是按位与运算,当 1 + 1时,按位与得1,再左移一位即可,得到10。与第一步结果相加得 10 + 10100 = 10110,即十进制结果为22。
   ④ 最终的终止条件:第②步的进位值为0时终止。
   Java 版:
public class Solution {
    public int Add(int num1,int num2) {
        //第2步的进位值不为0,则递归,进位值为0时,第一步的按位异或后的结果即为所求和
        return num2 != 0 ? Add(num1^num2,(num1 & num2) << 1) : num1;
    }
}

你可能感兴趣的:(数据结构和算法,java位运算,按位与,按位异或,与运算,异或)