程序猿混口饭吃不容易,从今天开始刷题。
原题地址:https://leetcode.com/problems/sum-of-two-integers/
题目的要求是:不允许使用“+”和“-”运算符,完成加法运算。显然,这题是要考位操作,其实背后就是加法器的实现原理。
要完成这道题,需要涉及下面这两个位操作:“异或”和“与”。
“a异或b”其实就是“相加不进位”,因为1^1是等于0的。那么进位如何获得呢?只有1+1的情况才会出现进位,恰好只有1&1是等于1的,因此“a与b”其实就是获得了所有的进位。既然是进位,那显然要把这个值左移一位,然后再与之前的异或结果相加。当然,还是不能够使用“+”运算符,因此需要用递归实现。
举个比较直观的例子:a = 0111, b = 1100, a + b = 10011
a ^ b = 1011, a & b = 0100, (a ^ b) + (a & b) << 1 = 1011 + 1000 = 10011
现在应该看明白了吧?思路清楚,代码很快也就写出来了:
public class Solution {
public int getSum(int a, int b) {
int xor = a ^ b;
int and = a & b;
return and == 0 ? xor : getSum(xor, and << 1);
}
}