java 给出两个整数a和b , 求他们的和。不用用运算符+

分析:

首先来理解一下十进制的加法
8884 + 146 = 9030
依据 不进位 + 进位 这一思想进行详述

首先是不进位的结果是8920
哪几位需要进位呢? 0011 也就是个位和十位需要进位,个位、十位进位之后的值为110,而这个结果是需要加到上面的不进位的值,即8920+110 = 8030 同样这是没有进位的,但是在这次相加的过程中也有进位的考量,哪几位呢?即100,百位的位置需要进位,那就再左移即可,为1000,然后加上上面的不进位相加的和,最后结果是9030,最后再看一下,还需不需要进位呢?发现8030&1000=0(按着二进制的形式写的,便于理解),此时是没有再需要进位的了,即最后结果就是9030了。
————————————————————————————
下面推广到二进制,是同样的思路的。
来看一下13+7这两个数的求和过程
13的二进制表示为:1101
7的二进制表示为: 0111

先求不进位的两个数之和,1101^0111 = 1010 ,
而哪几位需要进位呢?可以用&运算符来确定,即1101 & 0111 = 0101,将此结果左移即是进位之后需要加在1010上面的值,这就有变成刚开始的状态了,两个数相加,先算不进位状态的和

然后再看哪几位需要进位,上面两种状态的值为 0000(不进位的结果) 1010(需要进位,待计算),后面的值再左移表示进位之后的结果为10100,
此时新的两个数是0000,10100

求不进位的和为10100,哪几位需要进位呢?00000,没有需要进位的,所以到此结束,返回10100即可,即是20.

最后附上代码

public class Solution{
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    public int aplusb(int a, int b) {
        if (b==0) 
            return a;
        return aplusb(a^b, (a&b)<<1);
    }
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值