剑指 Offer 65. 不用加减乘除做加法

题目:

剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法_第1张图片

题解:

剑指 Offer 65. 不用加减乘除做加法_第2张图片
剑指 Offer 65. 不用加减乘除做加法_第3张图片
剑指 Offer 65. 不用加减乘除做加法_第4张图片
剑指 Offer 65. 不用加减乘除做加法_第5张图片
剑指 Offer 65. 不用加减乘除做加法_第6张图片

代码:

1. 代码一:迭代

public class 面试题65 {

    // 方法1:迭代
    public static int add(int a, int b) {
        int sum; // 无进位和
        int carry; // 进位值
        while(b != 0) // 当进位为 0 时跳出
        {
            sum = a ^ b; // 异或操作得无进位和
            carry = (a & b) << 1; // 与操作后,左移一位得进位值
            // 循环,直到进位为0
            a = sum;
            b = carry;
        }
        return a;
    }

    public static void main(String[] args) {
        int a = 20, b = 17;
        int res = add(a, b);
        System.out.println(res);
    }
}

2. 代码二:递归

public class 面试题65 {

    // 方法2:递归
    public static int add(int a, int b) {
        if(b == 0)
        {
            return a;
        }
        if(a == 0)
        {
            return b;
        }
        int plus1 = a ^ b; // 计算无进位和(不计进位). 相同位置0,相反位置1
        int plus2 = (a & b) << 1; // 计算进位. 先保留同为1的位,都为1的位要向左进位,因此左移1位
        return add(plus1, plus2);
    }

    public static void main(String[] args) {
        int a = 20, b = 17;
        int res = add(a, b);
        System.out.println(res);
    }
}

参考:

  1. 面试题65. 不用加减乘除做加法(位运算,清晰图解)
  2. 【二进制求和】超详细推导公式,打败100.00%用户
  3. 禁止套娃,如何用位运算完成加法?
  4. 位运算_面试题65. 不用加减乘除做加法
  5. 【每日算法Day 66】经典面试题:不用四则运算如何做加法?
  6. 按位异或和按位与运算

你可能感兴趣的:(剑指Offer)