一.不用运算符的加法
1.题目描述
设计一个函数把两个数字相加。不得使用 + 或者其他算术运算符。
力扣:力扣
2.问题分析
1.知识预备
注意:下面所有的结论的进位是考虑二进制的进位,因为我们使用的位运算符,是针对二进制进行的.
- 结论一:在不考虑进位的情况下,其无进位加法结果为 a⊕b.
- 结论二:而所有需要进位的位为 a & b,进位后的进位结果为 (a & b) << 1.
2.问题解决
知道了上面两个内容之后,我们就可以很容易的对这个问题进行解决了.
情况一:当a+b没有进位的情况,根据上面的结论,结果很显然是a⊕b
举例说明:1+2 从下图可以看出相加的结果为异或的结果.
情况二:当a+b有一次进位的情况,当我们存在进位的情况的时候,显然这个时候的结果应该是进位的结果加上异或的结果,但是我们是不能使用加法运算的,因此我们必须在进行循环运算,先保留a^b的结果,也就是没有进位的结果,然后保留进位结果carry=(a&b)<<1;然后再进行a^b^carry,,carry之后保留的结果就为0了,因为我们现在考虑是一次进位的情况.
举例说明:3+2
情况三:当a+b有n次进位的情况 其实根据情况三我们就可以总结出规律了,当某次运算保留的carry结果为0的时候,我们得到的结果就为最终的结果了,也就相当于(ans+carry(0))=ans了.
这里我们就不进行举例了,直接看代码.
3.代码实现
public int add(int a, int b) {
while(b!=0){
int carry=(a&b)<<1;
a=a^b;
b=carry;
}
return a;
}