LeetCode

链接

371. Sum of Two Integers

题意

计算两个整数的和,但是不能使用+和-运算符。

思路

不能用加减运算符的话,则需要利用位运算。两个数a和b相加,那么会产生尾数,还有可能进位。在位运算中,0+0=1,0+1=1,1+0=1,1+1=10,可以发现前三个式子和第四个式子的尾数(0)和异或的规律是一样的。
可知:

尾数=a^b

那么产生的进位该怎么算呢,显然只有两个数都为1才能进位,所以这和按位与的规律一致。
可得:
进位值=(a&b) * 2(进位数要乘以进制才能相加,也就是乘以2)

那么可得:
a+b=a^b+(a&b)*2

这个表达式中还是有加号,但可以发现,进位项不断乘以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.

原文地址:https://www.cnblogs.com/zyoung/p/6682612.html