不用运算符求加法

有这么一道题,要求不用 + - * / 运算符,来求两个数的加法

解题思路:我们先用两个10进制的数来相加,678+789,在不考虑进位的前提下,相加得357,只考虑进位的前提下,我们观察到,1110是这个数的每一个进位。第一个1是百位的进位,最后一个0是个位的进位,因为对个位没有进位,所以为0.将不考虑进位的数和只考虑进位的数相加得1467,刚好是两个数之和,所有我们得出一个结论:
两个数不考虑进位相加得到的值和只考虑进位的值相加就是两数之和

而在二进制下,我们举一个例子 01001和01101。如果不考虑进位的前提下,两数相加为00100.发现这与异或^得到的值一致。而只考虑进位的话,值为 10010 ,而两个数相与&得到的是01001,可以发现如果把相与的值左移<<一位就得到只考虑进位的值。而根据上面的结论,我们把异或得到的值和相与左移一位得到的值相加得00100+10010 = 10110,即为两数之和

总结:当最高位不产生进位时,即只考虑进位的值为0,根据结论,两个数相加得结果 = 异或的结果+0,即此时两个数异或的结果即为两数之和。

代码:

int _Add(int a, int b)
{
	while (b != 0)//当进位为0时,a即为两数之和
	{
		int tmp = a^b;//a与b异或相当于a与b相加,不考虑进位
		int p = (a&b)<<1;//a和b相与,再左移1,相当于只考虑进位
		a = tmp;
		b = p;
	}
	return a;
}
void main()
{
	cout << _Add(15, 12) << endl;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值