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

  • 相关阅读:
    web开发(六) EL表达式
    web开发(五) JSP详解(四大作用域九大内置对象等)
    web开发(四) 一次性验证码的代码实现
    Netty4
    Android Fragment
    Android 6.0 双向通话自动录音
    安卓
    SpringMVC + Spring + Mybatis+ Redis +shiro以及MyBatis学习
    Spring 3 AOP 概念及完整示例
    Java并发之CountDownLatch、CyclicBarrier和Semaphore
  • 原文地址:https://www.cnblogs.com/hezhiyao/p/7662249.html
Copyright © 2011-2022 走看看