a + b 不使用加号如何运算

作者: Jacky_Y | 来源:发表于2018-01-29 16:52 被阅读78次

原理: 位运算(&与、|或、~非、^异或)

对于二进制的加法运算如下(先不考虑进位):
1 + 0 = 1
1 + 1 = 0
0 + 1 = 1
0 + 0 = 0
有木有很熟悉,这是异或(^)运算呀,a ^ b,如果只考虑进位呢:
1 + 0 = 0
1 + 1 = 1
0 + 0 = 0
0 + 1 = 1
之后,我们需要把计算结果左移(<<)一位,放到进位处,即上边的计算可以看做 (a & b)<< 1

如果拿 1 + 1 来看:
a ^ b = 0
(a & b) << 1 = 10
这两个结果是非进位与进位的结果,需要将二者继续相加,但是发现当其中某一个结果为0时,也就没有继续加的必要了,那么 10 (2) 就是答案。

如果5 + 3 呢 ?按照上边的步骤:
101 ^ 11 = 110
(101 & 11) << 1 = 10
说明没进位部分是 110, 进位部分是 10,加起来是 1000(也就是 8)那不妨我们再按照这样的方法来一遍,
110 + 10 = ?
110 ^ 10 = 100
(110 & 10) << 1 = 100
好吧,还没完,继续
100 ^ 100 = 0
(100 & 100) << 1 = 1000
诶~有一部分为0了,就它了(1000)正好是8!从上边的分析过程,就是一个递归,算法这东西,自己琢磨琢磨吧,代码提供在下方:

    public int aplusb(int a, int b) {
        if (a == 0 && b == 0) {
            return 0;
        } else if (a == 0) {
            return b;
        } else if (b == 0) {
            return a;
        }
        return aplusb((a & b) << 1, a ^ b);
    }

相关文章

  • a + b 不使用加号如何运算

    原理: 位运算(&与、|或、~非、^异或) 对于二进制的加法运算如下(先不考虑进位):1 + 0 = 11 + 1...

  • A+B问题

    不用加号计算A+B,我们用异或运算和与运算以及位运算来实现同等的操作,A^B的二进制异或运算,相当于没有进位的加号...

  • 运算符

    算术运算符 > +-*/ + 号遵循从左到右,可作为运算加号和连接符使用% 取模即取余数a++ 后加加...

  • 运算符重载

    对于内置的数据类,编译器直到如何进行运算 对于自定义数据类型,需要运算符重载 加号运算符重载 左移运算符重载 重载...

  • 12月23日学习内容

    1.基本数据类型 *基本数据的运算符号 +加号 -减号 乘号 /除号 %取余运算 2.字符串的使用 Str...

  • 算法:不使用加号,求两数之和

    算法 求两个数之和,但不能使用加号运算符 方法一: 方法二: 方法三: 方法四:

  • 9.22

    运算符重载,用一段代码重新定义加号,以实现想要达到的加号效果。实现时,首先把指定的运算表达式转化为对运算符函数的调...

  • JS中的运算符简介

    在JS中,运算符主要是用以连接简单表达式,组成复杂表达式,比如下面就是一个简单的加号运算符组成的表达式;a + b...

  • Day3 数据类型和字符串

    Python支持:数学运算符、比较运算符、逻辑运算符、、赋值运算符、位运算符 数学运算符:+(加号)、-(减号)、...

  • 运算符、字符串、数字类型

    一 、运算符 python支持:数学运算符、比较运算符、逻辑运算符、赋值运算符。 1、数学运算符:+(加号)、-(...

网友评论

    本文标题:a + b 不使用加号如何运算

    本文链接:https://www.haomeiwen.com/subject/jxtfzxtx.html