• 剑指offer四十八之不用加减乘除做加法


    一、题目

      写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

    二、思路

    1、 采用位运算的方法,分三步:
      (1)、两个数异或:相当于每一位相加,而不考虑进位
      (2)、两个数相与,并左移一位:相当于求得进位
      (3)、重复步骤1和2,两个数相与的结果为0,和即为两个数异或的结果
    2、例子演示:
     
    3+11 = ?
     
    13 的二进制      1 1 0 1                     -----a        13
    11 的二进制      1 0 1 1                     -----b        11  

     (a&b) <<1  ->   1 0 0 1 0                 -----d         18
                a^b  ->     0 1 1 0                   -----e          6

     (d&e) <<1  ->   0 0 1 0 0                 -----f         4
                d^e  ->  1 0 1 0 0                  -----g        20

     (f&g) <<1  ->   0 1 0 0 0                ------h        8
                f^g  ->  1 0 0 0 0                 ------i           16

     (h&i) <<1  ->   0 0 0 0 0               ------h        0       ---- --------退出循环
                h^i  ->  1 1 0 0 0                ------i           24
    在第一步中,采用异或
    第二步中,采用按位与,左移一位

    三、代码

    public class Solution {
        public int Add(int num1,int num2) {
            while( num2!=0 ){ //当进位等于0的时候,返回异或的结果,即是要求的和
                int sum = num1 ^ num2; //两个数异或:相当于每一位相加,而不考虑进位
                int carray = (num1 & num2) << 1;//两个数相与:并左移一位:相当于求得进位
                num1 = sum;
                num2 = carray;
            }
            return num1;
        }
    }
    View Code

    ---------------------------------------------

    参考链接:

    https://www.nowcoder.com/questionTerminal/59ac416b4b944300b617d4f7f111b215

  • 相关阅读:
    表单输入框黏贴自动过滤转义实例
    前端性能优化成神之路-浏览器缓存机制详解
    前端性能优化成神之路-HTTP压缩开启gzip
    前端性能优化成神之路—重绘与回流
    前端性能优化成神之路—图片相关的优化
    ES5-ES6-ES7_集合Set和Map
    ES5-ES6-ES7_解构赋值
    ES5-ES6-ES7_函数的扩展
    ES5-ES6-ES7_数值的扩展
    ES5-ES6-ES7_字符串与JOSN格式的数据相互转换以及深度克隆新对象
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7662249.html
Copyright © 2020-2023  润新知