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

  • 相关阅读:
    Ext js-02 -官方API文档使用
    [Python3网络爬虫开发实战] 1.1-Python3的安装
    什么是关系型数据库?
    htaccess分布式配置文件常用写法
    PHP无限极分类
    svn在linux上的安装
    优化Web中的性能
    Python 面向对象(初级篇)
    文本日期提取
    HMM分词实例
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7662249.html
Copyright © 2011-2022 走看看