算法面试题汇总-模拟面试-两整数之和

时间:2021-04-19 16:00:45   收藏:0   阅读:0

两整数之和

不使用运算符 + 和 - ???????,计算两整数 ???????a 、b ???????之和。

示例 1:

输入: a = 1, b = 2
输出: 3
示例 2:

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

思路:

  1. 两个整数进行异或运算,可以获得不带进位的和
  2. 两个整数进行与运算然后左移一位,可获取其进位的值,将所得数字继续相同的步骤,直到进位的值为 0 。

例子:

补码 = 原码的反码 + 1

负数异或需转换成补码形式进行计算,3 的补码:0000 0011,-2的补码:1111 1110

#include<iostream>

using namespace std;
class Solution {
public:
    int getSum(int a, int b) {
      if((a&b) == 0) return a|b;  
      return this->getSum(a^b,(a&b)<<1);  
    }
};

int main() {
  Solution a;
  cout << a.getSum(5,7) << endl;
  return 0;
}

Line 5: Char 36: runtime error: left shift of negative value -2147483648 (solution.cpp)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior prog_joined.cpp:14:36

while (b) {
    auto c = ((unsigned int)a & b) << 1; // 防止 AddressSanitizer 对有符号左移的溢出保护处理
    a = a ^ b;
    b = c;
}
return a;

或者

if((a&b) == 0) return a|b;
return this->getSum(a^b,((unsigned int)a&b)<<1);  
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!