通过位运算计算A+B问题,不使用四则运算

这是一个模拟计算机中实现加法器的程序,所有的数加法最后都是在计算机中用二进制的位操作实现

 两个一相加会产生进位,所以这个用两个数相与然后左移一位实现进位操作

public class APlusB {

    public static void main(String[] args) {

        System.out.println(aplusb(10, 23));

    }

    /**
     * 这是一个模拟计算机中实现加法器的程序,所有的数加法最后都是在计算机中用二进制的位操作实现
     * 两个一相加会产生进位,所以这个用两个数相与然后左移一位实现进位操作
     * 10,01,00这三种情况相加不会产生进位,所以用异或来实现
     *
     * eg:
     * 十进制:4 + 7
     * 转换成二进制:010 + 111
     * 执行过程:
     * 两数异或得a1:101
     * 两数相与后左移一位得b1:100
     * 将上一轮的计算结果再继续操作,直到进位数为0
     * a1^b1得a2:001
     * a1&b1<<1得b2:1000
     * 继续递归:
     * a2^b2=a3:1001
     * a2&b2=b3:0000
     * 此时进位数b3已经成为0也就说没有进位,则把a3返回
     * @param a
     * @param b
     * @return
     */
    private static int aplusb(int a, int b) {
        if (b == 0)//直到没有需要进位的时候返回
            return a;
        int a1 = a ^ b;//两个数异或计算出不需要进位的数
        int b1 = (a & b) << 1;//两数相与再左移一位计算出需要进位的数
        return aplusb(a1, b1);//将需要进位的数和不需要进位按照相同的处理逻辑再处理
    }
}

猜你喜欢

转载自blog.csdn.net/tab_yls/article/details/80962050