【剑指Offer】面试题65. 不用加减乘除做加法

题目

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

示例:

输入: a = 1, b = 1
输出: 2

提示:

  • a, b 均可能是负数或 0
  • 结果不会溢出 32 位整数

思路

普通十进制相加过程:
(1)各位相加,无进位(2)计算进位值(3)无进位和加上进位值
二进制相加过程:
(1)两个二进制数异或模拟无进位相加,得到无进位和(2)二进制各位与再左移,计算进位(3)无进位和与进位异或
重复以上操作,直到进位不为0。

代码

时间复杂度:O(1)
空间复杂度:O(1)

class Solution {
public:
    int add(int a, int b) {
         int sum, carry;
         while (b != 0) {
             sum = a ^ b;
             carry = (unsigned int)(a & b) << 1;//表示进位
             a = sum;
             b = carry;
         }
         return a;
    }
};
posted @ 2020-04-13 22:21  Galaxy_hao  阅读(152)  评论(0编辑  收藏  举报