突然出现的一道easy标签的题目,题意很简单,两个数相加,但不能使用“+”,"-" 操作符。
首先想到不能使用加减操作符,能否使用乘除和多项式的转化表达出a+b,结果发现好像不能,无论如何都会出现需要+的项。
然后想到按位模拟运算,但是太麻烦了,感觉不是正解。
看了讨论区以后看到大神很神奇的一行代码搞定:
int getSum(int a, int b) {
return a & b ? getSum((a & b) << 1, a ^ b) : a | b; }试了一下,嗯,不是骗子,可以AC ,然后开始尝试理解:
首先当a&b = 0 时 return a| b , a&b = 1 时 return 一个递归式;
a&b = 0 的情况很好理解:当任何一个加数等于0时,返回另外一个加数即可
递归式比较复杂:
先看异或(^,开始当成了乘方,纠结了好久)运算: 0 ^ 0 = 0 0 ^ 1 = 1 1 ^ 0 = 1 1 ^ 1 = 0
再看加法的进位运算: 0 + 0 = 1 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0(进位)
除了进位的话结果完全一样,所以如果没有进位的话,我们可以直接用异或替代加法。
再考虑进位运算, 只有当 两位都是1 时才会进位, 那么通过与运算& 我们就可以得到所有两个数都为1 的位,由于进位是要加到高位上的,
所以我们再把与之后的结果左移一位,与异或后的结果相加,就可以得到完整的加法结果,
在递归过程中,一个参数表示异或的结果,另一个表示进位的结果,那么递归的终点呢?
就是不再进位,由于两个数是有限长度的,在经过最多32次循环后肯定不再需要进位,那么其中一个参数就会为0,我们就得到了最终的结果了。
膜拜大神们的思路,默默滚去刷题了~