很自然想到位运算,因为其实加法的实现就是由底层的二进制运算完成的,现在只不过逆推一下。
于是,对于32位的int来说:
int add(int a,int b){
int carry = 0;
int sum = 0;
int t = 1;
for(int k=0;k<32;k++){
int i = a&t;
int j = b&t;
sum = sum|(i^j^carry);
carry = (i&&j) || (i&&carry) ||(j&&carry);
t=t<<1;
carry = carry==0?0:t;
}
return sum;
}
忽然看到一个更屌的,我直接给跪了,弄死我我都想不出来这种方法,什么位运算统统玩儿蛋去。
int add(int a,int b){
char * c;
c = (char *) a;
return (int)&c[b];
}
根据地址来让编译器自己帮你去算,首先把a强制转换为地址,然后找以c为首地址,偏移量为b的地址,就是a+b的值。
例如a=5,b=10
c=(char*) a,此时c的地址为0x00000005
c[b] 就是c的地址偏移sizeof(char)*b
最终得到了c[b]的地址就是0x0000000f,即通过int强制转换得到15 。 屌爆了
上面两个函数对于负数也可以handle
===============================modified on 3rd, April, 2014=============================
在career cup上看到这道题,发现我想的太简单了,我之前写出来的迭代的算法比较废柴。
递归的算法才是王道:
具体思路看代码即可,图样图森破
int myAdd(int a,int b){
if(b==0)
return a;
int sum = a^b;
int carry = (a&b)<<1;
return myAdd(sum,carry);
}
carry是进位所以要左移一位。
这个思路么,不像我第一个直接迭代的方法那么直观
这里的第一步是只相加不进位,第二步是只计算进位,第三步再把二者加起来。
===============================modified on 3rd, April, 2014=============================