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


本题 题目链接

题目描述


我的题解

位运算

思路分析

  • 既然不能用加减乘除,那想想,就只剩下位运算符了似乎:
    • & (按位与)
    • | (按位或)
    • ^ (按位异或)
    • ~ (按位取反)
    • << (按位左移)
    • >> (有符号的按位右移)
    • >>> (无符号的按位右移)
  • 然后我们想想,再结合之前对位运算的经验(没啥经验的就拿两个数,一边算算过程,一边体会一下怎么可以和加法扯上关系)
    然后尝试运算过程中你会发现:
    • 异或运算^:相当于 不进位 的加法。
      (然后想想,那 什么位运算 可以 计算出每次的进位呢?)
    • 按位与&:相当于 进位。(because: 只有同为 1,&运算结果才为 1;而对于加法来说,只有两个 1 才有进位 1。这不就匹配上了吗!)
      • 既然是进位,那就是高一位的数要加1。故而,需先把按位与的结果左移一位,再和异或的结果进行异或运算。
  • 最后,我们知道,只有当两个数相加,没有进位的时候,异或运算得出的结果才是相加的结果。所以,只有当按位与运算的结果为0的时候,才可以呀!

代码如下

    public int add(int a, int b) {
        int xor, and;
        while (true) {
            xor = a ^ b;
            and = a & b;
            if (and == 0) break;
            a = xor;
            b = and << 1;
        }
        return xor;
    }

原文地址:https://www.cnblogs.com/duduwy/p/13390552.html