算法详解
通常看到题目写不能使用加减乘除....一些限制信息,就可以想到使用位运算或者递归来做
1:两个数做^运算,得到各位相加不进位的计算结果
2:两个数做&运算,得到进位,(因为&是11得1,只有两位都是1时,才会进位),因为进位是要加到左一位的,所以需要左移1
3:因为可能有些位数加上进位后还要进位,所以要迭代直到进位为0
比如111和001,第一位11所以要进一位,第二位1 + 0 + 1也需要进位,第三位也是如此,最后为1000
知识点
两个二进制数相加规则
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 //进位余0
二进制数相加的个位之和为:a ^ b; //所以异或运算可以用于计算两个二进制数之和
进位为:(a & b) << 1; // 一下子算出所有的进位
二进制减法运算
1 - 0 = 1
1 - 1 = 0
0 - 0 = 0
0 - 1 = 1 //借2余1
然后这道题的话我们只要让个位和进位相加就可以了;
java代码
class Solution {
public int add(int num1, int num2) {
int sum = num1 ^ num2, c = (num1 & num2) << 1;
return sum + c;
}
}