1.题目
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:输入: a = -2, b = 3
输出: 1来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2.code
class Solution {
public:
int getSum(int a, int b) {
int c;
c=0;
while(b)
{
c=(unsigned int)(a&b)<<1;
a=a^b;
b=c;
}
return a;
}
};
3.分析
当时卡了很久,不知道怎么做,看了讨论区。突然想到了数字电路学习的加法器,其实是一个道理,首先a^b求的是不进位的和,a&&b是进位信息。半加器不考虑进位,我们需要全加的化,也就是下一次计算,需要考虑前一位的是否有进行信息。从右向左开始加,第0位由于没有前一位所以没有进位信息,所以直接半加器就可以完成,所以我们需要将进位信息左移一位,因为我们第i位之间相加,需要额外加进去的是第i-1位的进行信息。当c为0则表示没有进位信息了,那么直接a^b就可以得到最终答案。
除此之外,使用unsigned int强行转化是因为leetcode编译器没有支持负数的左移。