剑指Offer JZ48 不用加减乘除做加法 C++实现

    科技2024-06-02  76

    题目描述

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

    解题思路


    方法一:位运算

    1、思路:由如下表格可以发现,在不考虑进位的情况下,两个数的和为这两个数按位异或,而两个数相加之后产生的进位为这两个数按位与再左移一位,当两个数相加之后不产生进位,则这两个数的和正好等于它们按位异或的结果。因为负数在计算机中用补码表示,补码可以统一处理加减法,因此以上方法同时适用于正数和负数的加法。循环求解:

    计算a和b的无进位和和进位;当进位为0,则a+b的结果就等于无进位和,返回无进位和;当进位不为0,则a+b的结果等于无进位和+进位,令a为无进位和,b为进位,继续循环。 操作数1操作数2&|^00000010111001111110 a(i)b(i)不考虑进位的和进位 c(i+1)0000011010101101

    2、代码:

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

    3、复杂度:

    时间复杂度:O(1);

    空间复杂度:O(1)。

    Processed: 0.020, SQL: 8