面试题65:不用加减乘除做加法

题目:

请写一个函数,求两个整数的和,要求在函数体内不得使用“+”、“-”、“×”、“÷”四则运算符号。

分析:

考虑十进制下,我们是如何做加法运算的,比如5+17=22。可以分为3步。

  1. 将各位相加,不进位,分别是5+7=2,1+0=1。
  2. 处理进位,5+7中有进位,进位值是10。
  3. 将第1步和第2步的结果相加,12+10=22=5+17。

既然不能使用加减乘除,那么只能使用位运算了。5的二进制是101,17的二进制是10001,使用上面的方法进行运算。

  1. 将各位相加,不进位,得到结果10100,对应的十进制是20。
  2. 处理进位,进位是二进制的10,对应十进制的2。
  3. 将第1步和第2步的结果相加,是二进制的10110,对应十进制是22。

对于第一步,0+0=0,0+1=1,1+0=1,1+1=0,这个效果和异或的结果是一样的。

对于第二步,只有1+1会产生进位。可以看做两个位做与运算,再左移一位。

对于第三步,将第一步和第二步的结果相加,此时继续重复第一步和第二步的步骤,直到最后不产生进位为止。

解法:

package com.wsy;

public class Main {
    public static void main(String[] args) {
        int a = 5, b = 17;
        System.out.println(fun(a, b));
    }

    public static int fun(int a, int b) {
        int num1, num2;
        while (b != 0) {
            num1 = a ^ b;
            num2 = (a & b) << 1;
            a = num1;
            b = num2;
        }
        return a;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值