不用运算符的加法运算

一.不用运算符的加法

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;

    }

猜你喜欢

转载自blog.csdn.net/qq_64580912/article/details/130716465