码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-04-19 16:00:45      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:示例   溢出   获取   class   ==   相同   输出   using   汇总   

两整数之和

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

示例 1:

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

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

思路:

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

例子:

  • 1 + 2: 0b01 0b10 >>> 0b11 0 >>> 0b11
  • 5 + 7: 0b101 0b111 >>> 0b010 0b1010(0b101 << 1) >>> 0b1000 0b0100(0b10 << 1) >>> 0b1100 0 >>> 0b1100
  • 12+34: 0b1100 0b100010 >>> 0b101110 0 >>> 0b101110
  • -2+3: 0b1110 0b0011(以16为周期) >>> 0b1101 0b010 >>> 0b1111 0 >>> 0b1111补码的原码 >>> 0b1110 >>> 0b0001

补码 = 原码的反码 + 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);  

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

标签:示例   溢出   获取   class   ==   相同   输出   using   汇总   

原文地址:https://www.cnblogs.com/hencins/p/14670997.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!