这道题目和之前leetcode中的二进制加法很相似。由于无法使用运算符,我们可以改用对位的操作。
如果不考虑进位的话:1+1=0,1+0=1,0+1=1,0+0=0,这刚好是异或计算^。
对于进位,正好是按位与&,左移一位之后的结果
在将两者进行异或,之后再计算进位,直到没有进位,完成运算,
同样有两种实现方式,代码如下
/**
* 递归方式
* @param x
* @param y
* @return
*/
public static int addTwo(int x,int y){
if ( 0 == y ) return x;
int sum = x ^ y;
//进位刚好是按位与后,左移一位
int carry = (x & y) << 1;
return addTwo(sum, carry);
}
/**
* 非递归方式
* @param x
* @param y
* @return
*/
public static int addTwo2(int x,int y){
if(0==y) return x;
int result=x^y;
int carry=x&y;
while(carry!=0){
int temp=carry<<1;
int temp2=result;
result=temp2^temp;
carry=temp2&temp;
}
return result;
}