(二)解题

题目大意:不用+或者-实现两个整数的加法 
解题思路:不用+或者-,就自然想到位运算,无非就是与或非来实现二进制的加法 
首先,我们来看一位二进制的加法和异或运算

ABA&BA^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 };
View Code

另一种:

 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 };
View Code

 

posted on 2016-07-23 17:15  人生一世,草木一秋。  阅读(10)  评论(0编辑  收藏  举报