剑指offer:不用加减乘除做加法
题意描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
解题思路
位运算
首先来看十进制加法如何计算的(33+59)
- 相加各位的值,不进位,结果是82,(3+9 = 12,舍弃进位就是2。3+5=8,没有进位是8)
- 计算进位,结果就是10
- 将上述的到的两个值重复步骤1和步骤2,直到进位为0,返回不进位的值。
- 82+10 (各位相加,不进位是92。进位是0,返回92)
对于二进制也可以使用相同的方法
- 相加各位的值,不进位,结果是26(100001+111011 = 011010),就是相同得0,不同得1。符合异或运算,可以使用
^
进行计算。 - 计算进位,也就是只保留相同的位,(100001+111011 = 100001),既然是进位制,所以还应该左移一位,得到
1000010
,在位运算中可以用(num1 & num2) << 1
表示。 - 重复上述步骤,直到进位为0,返回进位的值。
public int Add(int num1,int num2) {
int sum = num1 ^ num2;
int carry = (num1 & num2) << 1;
if(carry == 0){
return sum;
}else{
return Add(sum,carry);
}
}