分析:
这个问题最容易想到的是利用位运算实现。类似数字电路中的全加器的原理。
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/