LeetCode每日一题(一)
面试题65. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a
,b
均可能是负数或 0- 结果不会溢出 32 位整数
/*先把两个数各个位相加,比如a=1011,b=1110
* 1.先不管进位,只做每个位数的相加
* 1011
* + 1110
* = 0101
* 2.这时,我们再看进位和,第一位和第三位都需要进位
* 0010
* + 0010
* = 0100
* -------------------
* 1000
* + 1000
* = 10000
* 第二步的和为 0100+10000 = 10100
*
* 3.然后将第一步和第二步的值进行相加 0101+10100= 11001
*
* 第一步使用 异或运算( ^,各位数比较,相等为0,不相等为1) (1)a ^ b
* 第二步,需要进位的位数都是1才会进位,使用 & (如果都为1,则返回1),然后 向右移一位,<<1 (2) a&b<<1
* 1011
* ^ 1110
* = 1010
* <<1 10100
* 到了第三步,我们如何不使用加法才能相加第一步和第二步的值呢?
* 第三步就是前两步的和,如果不使用加法,我们就一直需要调用前两步的步骤
*
* a+b=(a^b)+(a&b<<1) c=(a^b) d=(a&b<<1)
* a+b = c+d;
* 现在我们需要计算c+d
* c+d=(c^d)+(c&d<<1) e=(c^d) f=(c&d<<1)
* c+d=e+f
* .....
* 以此循环,我们需要循环到什么时候就可以停止了呢,当进位和等于0的时候,我们就可以停止了
* */
public static int add(int a, int b) {
while (b != 0) {
int temp = a ^ b;
int temp2 = (a & b) << 1;
a = temp;
b = temp2;
}
return a;
}