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

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

对于二进制的加法运算如下(先不考虑进位):
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);
    }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 【1】7,9,-1,5,( ) A、4;B、2;C、-1;D、-3 分析:选D,7+9=16;9+(-1)=8;(...
    Alex_bingo阅读 19,153评论 1 19
  • 今天下午最后一节课,郑老师教我们缝沙包,我想:小菜一碟,不就是缝个沙包吗, 一针一针的缝起来再装上豆子,肯定...
    失心爱阅读 761评论 0 1
  • 今天下午我家的星级大厨又煮了一锅的红糖豆粥。里面的原材料有红豆,赤小豆,莲子,桂圆肉,还有最重要的红糖。 ...
    饶文灿阅读 225评论 2 6