给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
说明
a和b都是 32位 整数么?
- 是的
我可以使用位运算符么?
- 当然可以
异或相当于的加法,实现加法器的时候就是用很多个异或。
当前位相加,当前位的结果:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0
很明显这和我们异或的结果的一样的。
两数相加,有可能进位。我们知道,二进制的加法,同位数相加的时候,要进位,就得两个数都是1。这其实和并(&)的计算是一样的。
a&b的结果:
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
a&b的结果中,第n位数为1,表示的是2个数的第n位相加,需要进位。相当于在第n+1位上面+1.相当于需要把a&b的结果往左移动1个二进制位。也就是a&b<<1;
所以 a+b 应该等于 a^b + (a&b)<<1 的结果。
但是 a^b +(a&b)<<1之后有可能还会进位,所以我们还需要用递归的方法来继续计算,直到没有进位为止。