浅析+运算

起因:

刷到一道算法题目: 计算A+B 的值 A和B都是32位的整数 题目有个挑战就是不用+运算符
第一反应:

public int  plus(int a ,int b){
   return a+b;
}

然后思考不用+运算符怎么计算
所谓前人种树,后人乘凉;看了看大家的解决办法 得到一些启发

 public  int plus(int a, int b) {
        //withoutUp 代表异或的值   up表示按位与之后左移一位的值
        int withoutUp = 0, up = 0;
        withoutUp = a ^ b;
        System.out.println(withoutUp);
        up = (a & b) << 1;
        System.out.println( up );
        if (up != 0) {
            return plus( withoutUp, up );
        } else {
            return withoutUp;
        }
    }

原理:

首先a和b都是32位的整数
把a和b转成二进制 然后在考虑计算
举个例子 3+2
3的二进制 : 0011 2的二进制表示:0010
正常相加 :
0011
0010
= 0101=5(10进制)
这个过程可以分为两步 :
第一步:不进位只考虑当前位的的结果 0001 这个值正好是a和b的异或的结果
第二步: 只考虑是否进位: 0010 说明倒数第二个需要进位 这个值 是a&b的结果 然后需要进位 那么左移一位成了 0100
这两个相加 就是考虑后进位的结果:
0001
0100
=0101

所以 : A+B = (A^B)+((A&B)<<1) 中间的+ 又可以用这个方法替换 直到没有进位了 那么值就是最后的结果

浅析+运算_第1张图片
image.png

你可能感兴趣的:(浅析+运算)