zoukankan      html  css  js  c++  java
  • 【剑指Offer-发散思维能力】面试题65:不用加减乘除做加法

    题目描述

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

    思路

    用位运算来模拟加法。两个二进制数之间的异或相当于不考虑进位的加法,如1010^1011=0001(对应十进制10^11=1),因为只有1+1才会产生进位,所以通过与运算计算进位1010&1011=1010,将不考虑进位的加法结果与进位左移一位(10100)相加就是考虑进位后的加法结果,相加的过程还是通过前面两个步骤来模拟,直至进位为0。整个步骤如下:
    (1)两个数字异或获得不考虑进位的加法结果;
    (2)两个数字与操作并左移一位获得进位;
    (3)将前两步得到的两个结果替换原来的两个数字,直至进位为0。
    代码如下:

    class Solution {
    public:
        int Add(int num1, int num2)
        {
            int sum = num1, carry=num2;
            while(carry!=0){
                sum = num1^num2;
                carry = (num1&num2)<<1;
                num1 = sum;
                num2 = carry;
            }
            
            return sum;
        }
    };
    

    拓展

    不使用新变量交换两个变量a,b的值。

    方法一:使用加法

    a = a+b;
    b = a-b;
    a = a-b;
    

    方法二:使用异或

    a = a^b;
    b = a^b;
    a = a^b;
    
  • 相关阅读:
    mongodb将mysql数据导入
    mongodb增删改查操作
    mongdb安装
    Python获取两个文件的交集、并集、差集
    java回调函数详解
    java线程锁之synchronized
    mysql知识点汇集
    Springboot2.0实现URL拦截
    idea将springboot打包成jar或者war
    leetcode1128
  • 原文地址:https://www.cnblogs.com/flix/p/12533198.html
Copyright © 2011-2022 走看看