题目描述:
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
思路:
二进制的加法无外乎就以下几种情况,
1+1 = 0 (有进位)
1+0 = 1 (无进位)
0+0 = 0 (无进位)
0+1 = 1 (无进位)
异或:相同为0,相异为1。只有0和1的时候才是1,同为0或者同为1都是0,而这个时候类比加法中有两种可能,
一个是1+1=0 进位1,一个是0+0=0 无进位 。所以还要知道这个0对应的是有进位还是没进位。这个时
候就要考虑位与的结果了。
位与:同为1是1,有0则为0。
类比加法:若与的结果为1,那么说明是1+1的情况,此时结果1可以看做是1+1的进位,所以要左移一位。
若与的结果是0,那么说明是1+0或者0+0,都是不需要进位的,此时直接输出异或的结果即可。
通过分析,我们可以把加法分解成无进位的异或(a^b)与保存的进位(a&b)相加,循环直到没有进位为止,即为结果。
int getSum(int a, int b){
while(b)
{
int and = ((unsigned int)(a & b)) << 1;//左移一位,与后的类型需转换为无符号整型
a = a ^ b;//异或操作,相同为0,相异为1,此时未考虑是否进位
b = and;
}
return a;
}
在题解看到比较新奇的做法用++和--操作,也可以参考这个思路。但是可能++,--也算涉及加法减法吧。测试是可以通过的。算是个新的思路。供参考:
int getSum(int a, int b){
if(a == 0){
return b;
}
if(b == 0){
return 0;
}
if(a > 0){
while(a != 0){
--a;
++b;
}
return b;
}
else{
while(a != 0){
++a;
--b;
}
return b;
}
}