废话少说,直接上例子。例如要算14+8的和,平常的思维方式,4+8得2进1,1+1得2不进位,结果就是22.思维方式就是自右往左,边加边求和,再进位,再重复以上步骤。
但是,现在限制住了加减乘除,剩下的只有与或非了。于是加可用异或,求进位可用与,重复上述步骤直到结果正确即可。改进一下,我们可分为三步走:
1,整体求和(异或)
2,整体求进位(与)
3,重复以上步骤(循环或递归)
C++代码如下:
int add(int num1,int num2) { while(num2) { int sum=num1 ^ num2 ;//异或 int carry=(num1 & num2) << 1 ;//与 num1=sum; num2=carry; } return num1; }
更巧妙的思路:
int add(int a,int b){ char* p= (char *)a ; cout<<*p<<endl; return (int)&p[b];//p[b]等价于*(p+b) }
思路是:定义一个char型指针指向a代表的地址,假如a=33,则p指向地址33,p[b]等价于p+b号地址的值,假设b为44,则p[b]指向77号地址的值,所以,对它取地址,就可以得出a+b的值。很巧妙。