面试题47. 不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路:用位运算替代
首先不考虑进位,0+0=0,0+1=1,1+0=0,1+1=0,相当于“异或”运算
然后考虑进位,只有1+1=1,相当于“与”运算。当有进位时,需要左移1位。
下图以2+3为例,说明了位运算过程:
- 第一步是“异或”,得到不考虑进位的结果
- 第二步是“与”,然后左移1位,得到进位
- 最后两者相加,这里需要使用递归。当进位为0时,递归结束。
public class Solution {
public static int Add(int num1, int num2) {
if(num2 == 0) { // 进位为0时,返回
return num1;
}
int num3 = num1 ^ num2; // 不考虑进位
int num4 = (num1 & num2) << 1; // 进位
return Add(num3, num4);
}
}