zoukankan      html  css  js  c++  java
  • 剑指 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;
        }
    

  • 相关阅读:
    C语言32个关键字详解
    C语言格式控制符
    c++关键字详解
    多码流简介
    Jtag管脚定义
    关于RGB信号的电平
    缩略语MSPS
    【转】松下18650的容量判别方法
    电信号在FR4材料中的传播速度
    dropout voltage
  • 原文地址:https://www.cnblogs.com/duduwy/p/13390552.html
Copyright © 2011-2022 走看看