不使用算数运算符,实现两个数的相加

作者:小 琛
欢迎转载,请标明出处

题目描述:
不允许使用任何的算术运算符,例如+,-等,实现两个数的相加

解析:

  1. 首先要明白,在算术运算符不可用的情况下,我们要解决这个问题,就必须用逻辑运算符或者说位运算符。
  2. 对于计算机来说,运算都是建立于二进制,因此我们在思考的时候,要以二进制的思想为根本。
  3. 拆分加法的本质,例如11+9,转换为二进制加则为1011 + 1001。实际上就是进行两个步骤:加和进位
  4. (1)加则是将每个位进行相加,对于0与1的组合直接加,可以用异或来实现。
    (2)而对于进位,则是1与1的组合要向前进一位,用与运算可以得到需要进位的项,左移一位就是进位之后的数。
    (3)再将二者异或,如果此时正好完全“吻合”,例如0101和1010,那么异或后的结果就是需要的结果。此时的两个数相与的结果也为0。而如果并不是完全吻合,例如1101和1010,则需要进一步操作,怎么操作呢?就又回到第一步了!
  5. 总结一下,可以用位运算实现,拆分加法的本质,加和进位。对于二进制来说,1和0的组合可以直接加,用逻辑运算异或实现。而对于1和1的组合,需要进位,利用与运算得到进位的位,左移一位即进位后的结果,该结果和之前加得到的结果异或,如果吻合则会满足二者相与为0,否则还需要进一步操作即再左移再异或再与运算判断。

代码用递归实现:

#include <iostream>

//不使用算数运算符,实现两个数的相加

/*
拆分加法的本质,加和进位。对于二进制来说,1和0的组合可以直接加,用逻辑运算异或实现。
而对于1和1的组合,需要进位,利用与运算得到进位的位,左移一位即进位后的结果,
该结果和之前加得到的结果异或,如果吻合则会满足二者相与为0,
否则还需要进一步操作即再左移再异或再与运算判断
*/
size_t addAB(size_t A, size_t B)
{
	size_t temp1,  temp2;
	temp1 = A^B;
	temp2 = (A&B) << 1;

	if (temp2 == 0)
		return temp1;
	else
		return addAB(temp1, temp2);
}
int main()
{
	std::cout << addAB(1, 9);
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值