leetcode 371. Sum of Two Integers
Calculate the sum of two integers a and b, but you are not allowed to use the operator +
and -
.
Example:
Given a = 1 and b = 2, return 3.
利用位运算, 这里用到了一个半加法的思想, 即两位单独的位相加其结果可以用异或得到, 进位可以用与得到.
首先观察一下运算:
01 + 01 = 10
01 + 00 = 01
00 + 01 = 01
00 + 00 = 00
可以观察得到进位是两个相加的数的与,个位是两个相加数的异或。
进位需要用<< 1 来表示,所以最后的结果为 相加数的异或 + 相加数的与 << 1 = 最后的结果
对于两位数而言,则是一直将相加数的异或和相加数的与<<1相加即可,也就是得到相加数的异或和进位<<1后,再讲这两个数当成加数,在进行加,直到最后进位为0,那么就不需要+,和最后就为异或的值。
比如:
01 + 11 = 100
异或:01 ^ 11 = 10
进位:01 & 11 = 01
异或 + (加数与 << 1)= 10 + 010 = 100
再次异或:10 ^ 10 = 00
进位: 10 & 10 = 10
异或 + (加数与 << 1)= 00 + 100 = 100
再次异或:00 ^ 100 = 100
进位: 00 & 100 = 000
异或 + (加数与 << 1)= 100 + 000 = 100
最后得到的结果就是100了。而这其中都没有用到+。
class Solution { public: int getSum(int a, int b) { while(b) { int carry = a & b; a = a ^ b; b = carry << 1; } return a; } };