算法面试题汇总-模拟面试-两整数之和
时间:2021-04-19 16:00:45
收藏:0
阅读:0
两整数之和
不使用运算符 + 和 - ???????,计算两整数 ???????a 、b ???????之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
思路:
- 两个整数进行异或运算,可以获得不带进位的和
- 两个整数进行与运算然后左移一位,可获取其进位的值,将所得数字继续相同的步骤,直到进位的值为 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);
评论(0)