思路:
使用位运算;其中运算规则:
0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 (进位)
对于位运算我们要考虑进位,所以我们将进位单独拆分计算;
1.异或运算:相异为1,相同为0,而且没有进位,所以用异或来表示相加但是没有进位的运算。
2.与运算:同为1时为1,将结果左移一位就相当于得到进位结果。
不断循环将与运算和异或运算结果进行相同的计算得到的新的两个式子,直到进位为0;
例:4+5
0100+
0101=1001 (就是异或:0001和与左移一位:1000相异或且进位为0的结果
1.题目如下:
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
提示:
-1000 <= a, b <= 1000
2.代码如下:
class Solution {
public:
//思路一:位运算 转化为补码之间的运算
int getSum(int a,int b) {
//异或运算 得到相加但没有进位的结果,异或运算是不会进位的
int sum=a^b;
//与运算 左移一位得到进位的结果
int carry=unsigned(a&b)<< 1;
//sum+carry,将进位的结果和没进位的结果相加
//当进位为0时结束,返回结果
while(carry!=0){
//再次将进位的结果保存下来
int temp=unsigned(sum&carry)<<1;
//得到没进位的结果
sum^=carry;
//保存进位的结果,并再次循环
carry = temp;
}
return sum;
}
};