(二)解题
题目大意:不用+或者-实现两个整数的加法
解题思路:不用+或者-,就自然想到位运算,无非就是与或非来实现二进制的加法
首先,我们来看一位二进制的加法和异或运算
A | B | A&B | A^B |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
与运算可以算出每一位上的进位,异或运算可是算出每一位相加的值。与和异或的值就等于加法后的值
于是,我们想到对于多位数的加法,异或运算也能求出每一位上相加的值(没有进位),然后考虑到进位,与得出每一位上面的进位
每次进位左移一位与没有进位的值再求异或,一直算到进位为0,即可得出最后的相加的值。
1 class Solution { 2 public: 3 int getSum(int a, int b) { 4 int sum = a; 5 int carry = b; 6 while(carry!=0) 7 { 8 int temp = sum^carry;//没有考虑进位的相加值 9 carry = (sum&carry)<<1;//进位左移一位,等待下一次循环加到sum中 10 sum = temp; 11 } 12 return sum; 13 } 14 };
另一种:
1 class Solution { 2 public: 3 4 int getSum(int a, int b) { 5 int and0; 6 int sum; 7 int tmp;//保存上一次的sum值,供就下一次的进位用 8 sum = a ^ b;//求和 9 and0 = a & b;//进位 10 while(and0 != 0 ){ 11 tmp = sum; 12 and0 = and0 << 1; 13 sum = sum^and0;//下一次求和 14 and0 = (tmp & and0);//下一次的进位 15 } 16 return sum; 17 } 18 19 };