LeetCode - 371. Sum of Two Integers
链接
题意
计算两个整数的和,但是不能使用+和-运算符。
思路
不能用加减运算符的话,则需要利用位运算。两个数a和b相加,那么会产生尾数,还有可能进位。在位运算中,0+0=1,0+1=1,1+0=1,1+1=10,可以发现前三个式子和第四个式子的尾数(0)和异或的规律是一样的。
可知:
那么产生的进位该怎么算呢,显然只有两个数都为1才能进位,所以这和按位与的规律一致。
可得:
那么可得:
这个表达式中还是有加号,但可以发现,进位项不断乘以2,其末尾就不断增加一个0,当0的个数足够多时(假设第n次),an&bn=0,则进位项被消除。因此,只要重复对该式迭代进行运算,进位项最终会变为0,加号也得以消除。
代码
Java:
public class Solution {
public int getSum(int a, int b) {
while(a != 0)
{
int x = a ^ b;
a = (a & b) << 1;
b = x;
}
return b;
}
}
效率
Your runtime beats 8.43% of java submissions.