不用加减乘除实现加法运算

很自然想到位运算,因为其实加法的实现就是由底层的二进制运算完成的,现在只不过逆推一下。

于是,对于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=============================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值