通过位运算计算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);//将需要进位的数和不需要进位按照相同的处理逻辑再处理
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值