题目描述:不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:

输入: a = 1, b = 2
输出: 3

示例 2:

输入: a = -2, b = 3
输出: 1

分析:这个题目如果是在c语言当中的话,我们就要想办法去用位运算实现了,但是在python之中(此处省略小编会心一笑),一行代码搞定

class Solution(object):
    def getSum(self, a, b):
        """
        :type a: int
        :type b: int
        :rtype: int
        """
        return sum([a, b])

简单说一下吧,因为python的内置函数都是基于C语言实现的,因此就避免了我们重复造轮子了,直接采用拿来主义用就是了。利用求和函数,满足题意,也可以完成任务,但是这样子有悖于题目本来的想法,大家还是要去看看具体的位运算的方法是如何实现的。等小编想清楚二进制位运算的方法来求解该题的时候小编会回来更新博文的。
好了,小编发了这篇博文之后感觉不能对不起这个题(还有出题人)就各种搜索怎么用二进制的位运算实现加减法,终于找到啦,小编用自己的话总结一下吧(毕竟直接转发的话不太好)。
首先,题目不能使用正常的加减法,那么对于算术运算符,除了加减,相信我们第一时间想到的就是位运算了(与或、异或等)首先我们从十进制入手,比如我们要对 16 和 19 进行求和,结果是 35 这毫无疑问。但是具体是怎么得到结果的呢,首先,我们将 9 和 6 进行相加,结果是 15 ;然后,我们将 5 保留,将 1 进位,然后进行十位上的两个 1 相加,得到结果2;最后,我们将之前的进位上的 1 进行相加,得到 3 。最后将 3 (其实应该是 30 )与最开始得到的 05(注意,这里我写的是05) 进行相加,即可得到结果 35。
为了保守起见,我们将该方法用在二进制上,看看是否符合结果。我们假设这次进行的运算时 5 和 17 。5的二进制是101,17的二进制10001。按照上面的三步来计算:首先,各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10,但是我们让这一步不计进位,因此结果仍然是0)。之后 ,我们看到这个例子只有一个进位就是发生在最后的那个二进制的10;最后一步,我们把前两步的结果相加,得到的结果是10110(也就是 十进制的22)。因此我们可以是说这个步骤对于二进制也是可以用的。
放在本题中,代码如下:

int getSum(int a, int b)
{
if(b == 0)
    return a;
 int sum = a ^ b;   //异或运算
 int carry = (a & b) << 1;     
 return getSum(sum, carry);

}