【剑指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;

猜你喜欢

转载自www.cnblogs.com/flix/p/12533198.html