作者:小 琛
欢迎转载,请标明出处
题目描述:
不允许使用任何的算术运算符,例如+,-等,实现两个数的相加
解析:
- 首先要明白,在算术运算符不可用的情况下,我们要解决这个问题,就必须用逻辑运算符或者说位运算符。
- 对于计算机来说,运算都是建立于二进制,因此我们在思考的时候,要以二进制的思想为根本。
- 拆分加法的本质,例如11+9,转换为二进制加则为1011 + 1001。实际上就是进行两个步骤:加和进位。
- (1)加则是将每个位进行相加,对于0与1的组合直接加,可以用异或来实现。
(2)而对于进位,则是1与1的组合要向前进一位,用与运算可以得到需要进位的项,左移一位就是进位之后的数。
(3)再将二者异或,如果此时正好完全“吻合”,例如0101和1010,那么异或后的结果就是需要的结果。此时的两个数相与的结果也为0。而如果并不是完全吻合,例如1101和1010,则需要进一步操作,怎么操作呢?就又回到第一步了! - 总结一下,可以用位运算实现,拆分加法的本质,加和进位。对于二进制来说,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;
}