刷题中经常见到一道题,不使用+加法。
来看下面网友回答:
这可真是个小机灵鬼。
但是这不是真正题目的意思。
题目的本质是想考察我们对于加法器的理解,主要是想我们通过位运算。
那么加法器该怎么去理解呢?
在内存中数据是以二进制形式存放的,如果不产生进位,可以直接对数据进行相异或。
我们给出个模板
如果不产生进位 直接相异或
如果产生进位 将进位和异或结果相加
直到进位为0
来看代码
class Solution {
public:
int getSum(int a, int b) {
while (b) {
auto c = ((unsigned int)a & b) << 1; //得到进位
左移是因为进位在下一位
对有符号左移的溢出保护处理
a = a ^ b; //相加
b = c;
}
return a;
}
};
递归写法
class Solution {
public:
int getSum(int a, int b) {
if (!(a & b)) return a ^ b;
return getSum(a ^ b, ((unsigned int)(a & b)) << 1);
}
};