2021/2/6 二刷
边界判定:当出现进位合为0的时候计算停止。
循环:每一轮使a为当前非进位合,b为当前进位合。由于b会改变,所以必须先存储非进位合的结果。
while(b) {
//非进位合
int res = a ^ b;
b = (unsigned int)(a & b) << 1;
a = res;
}
最终结果:res 即 a
题目描述
位运算
一、十进制
19 + 8 = 17 + 10
131 + 79 = 900 + 110 = 10 + 1000 = 1010
在草稿纸上写加法运算时,我们会直接把进位移动到前一位 +1,但实际上加法就是经历一个这样的过程
所有的加法都是先计算非进位合再加上进位合的。
设非进位合为n,进位合为c,则
然后题目可能出现负数怎么办呢,其实只要计算机补码加减计算是正确的,我们这样就是正确的。
还有LeetCode里面的C++不支持负数左移,所以要变成无符号整数,关于unsigned int到底是怎么样的,负数情况又怎么回事,不是很理解。
class Solution {
public:
int add(int a, int b) {
while(b != 0) {
//此轮非进位合
int res = a ^ b;
//此轮进位合
b = (unsigned int)(a & b) << 1;
//更新a为此轮非进位合,继续与进位合进行运算
a = res;
}
return a;
}
};
时间复杂度O(1)
空间复杂度O(1)