不使用运算符 + 和-,计算两整数a 、b之和。
示例:
若 a = 1 ,b = 2,返回 3。
这道题原来的解法还是有问题,既然明确了不能用+,-运算符,自然是只能用位运算解决问题,也就是关于二进制的相加。
1 对于二进制的两个数加在一起,若没有进行进位,只要a和b的i为相同,那么总和的i位就是0,也就是抑或操作
2 若只进行进位,只要a和b的i-1位皆为1,总和的i位就为1,这就是位与操作后在进行位移操作
3 递归重复上述步骤,找到没有进位结束。
class Solution {
public:
int getSum(int a, int b) {
if(b == 0) {
return a;
}
int sum = a ^ b; //相加但不进位
int carry = ((unsigned int)(a & b)) << 1; //进位但不相加,考虑到负数的问题,需要转为无符号整数移位
return getSum(sum, carry); //递归
}
};
class Solution {
public:
int getSum(int a, int b) {
int sum = 0 ;
int carry = 0;
for(int i = 0;i< 32 ;i++){
int a1 = a & 1;
int b1 = b & 1;
int val = 0 ;
if(a1 == 0 && b1 == 0 && carry == 0){
val = 0;
carry = 0;
}else if(a1 == 1 && b1 == 1 && carry == 1){
val = 1;
carry = 1;
}else if(a1==0 && b1 ==0 || a1 ==0 && carry ==0 || b1 ==0 && carry ==0){
val = 1;
carry = 0;
}else{
val = 0;
carry = 1;
}
val = val << i;
sum = sum | val;
a = a >> 1;
b = b >> 1;
}
return sum;
}
};