分析:
这个问题最容易想到的是利用位运算实现。类似数字电路中的全加器的原理。
2bit全加器的原理如下:
输出S=A异或B
进位C=A与B
真值表如下:
A |
B |
S |
C |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
因此可以推广到一般数字相加的计算中。
例如:5的二进制是101,17的二进制10001。
把计算分成三步:
第一步各位相加但不计进位,得到的结果是10100(最后一位两个数都是1,相加的结果是二进制的10。这一步不计进位,因此结果仍然是0);
第二步记下进位。在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10;
第三步把前两步的结果相加,得到的结果是10110,正好是22。
于是我们可以构造一个算法(运用递归的思想):两个数按位做异或运算(相当于不考虑进位的加法),再相与并左移一位向前进位,加上进位(可以用递归,因为没加一次都可能产生进位,进位为0就停止)。
int AddWithoutArithmetic(int num1, int num2) { if(num2 == 0) return num1; int sum = num1 ^ num2; int carry = (num1 & num2) << 1; return AddWithoutArithmetic(sum, carry); }
另一种巧妙解法:
思想:将第一个数作为地址,第二个数作为地址偏移量,利用数组的下标运算加上偏移量。
实现代码:
int add(int a,int b) { char * c; c = (char *) a; return &c[b]; }
Ref:
http://blog.csdn.net/congduan/article/details/7591716
http://zhedahht.blog.163.com/blog/static/254111742011125100605/