算法1
(模拟加法器) $O(1)$
不使用加减乘除来进行加法运算,我们可以模拟计算机的加法器实现。
举个例子:14+8
14的二进制表示:1110
8的二进制表示:1000
我们将整个运算分为1. 进位 2.不进位
第一步进行不进位的运算:
十进制来看:十位为1+0=1,个位为4+8=2 结果为12
二进制来看: 1110+1000=0110 (不进位) 结果为0110
第二步进行进位的运算:
十进制来看:只有个位上的4+8进位1得到10 结果为10
二进制来看:1110+1000=10000 (只注意进位) 结果为10000
第三步将进位与不进位的结果相加:
十进制结果:12+10=22
二进制结果:10000+0110=10110 ==十进制下的22
至此完成了加法运算。
观察上面的计算过程:
二进制不进位的运算结果与 异或 运算结果相同
二进制进位的运算结果与各位 相与& 后左移一位的结果相同
因此我们可以通过与运算与异或运算来实现加法运算
1.计算俩个数不算进位的结果(num1^num2)
2.计算两个数算进位的结果 (num1&num2)<<1
3.将两个结果相加.我们发现又要用到加法运算,那么其实我们重复上述步骤就行了,直到一个数变为0(不再进位)运算全部完成
C++ 代码
class Solution{
public:
int add(int num1,int num2){
while(num2){
int x=num1^num2;
int y=(num1&num2)<<1;
num1=x;
num2=y;
}
return num1;
}
}
帅哦~
只有个位上的6+6进位1得到10 结果为10 这里为什么是6+6
已修复
有个疑问,为什么while里的num2不能换成num1呢
因为我们要保证的是不再有进位则循环结束,将x赋给num1表示将不进位计算结果赋给了num1
厉害
!
厉害,懂了
%%%%%%