题目
给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
输入:1,2
返回:3
解题
题目思路:
-
如果不进位两个二进制数异或的结果,等于两个二进制数相加的结果。
异或:0 ^ 0 = 0, 1 ^ 0 = 1, 1 ^ 1 = 0;
相加:0 + 0 = 0, 1 + 0 = 1, 1 + 1 = 0; -
二进制进位的结果等于两个二进制数的与的结果。
相与:0 & 0 = 0, 1 & 0 = 0, 1 & 1 = 1;
进位:0+0(不进位),1+0(不进位), 1+1(进位);
举例:2 + 3
xor = 0010 ^ 0011 = 0001; 两个数相加不考虑进位
and = 0010 & 0011 = 0010; 判断是否进位
and = and << 1 = 0100; 如果要进位,进位的值要给下一位
xor + and ;所以最终的值是异或的结果 + 进位的值,这里又是加法,所以重复上述步骤(使用循环)
xor ^ and = 0101;
xor & and = 0000; 在这其中判断进位的数是0,循环的终止条件。
最终的结果就是 0101(二进制) = 5(十进制)
代码
import java.util.*;
public class UnusualAdd {
public int addAB(int A, int B) {
// write code here
int xor, and;
while(B != 0){ //判断进位数是为零
xor = A ^ B; //两个数相加不考虑进位
and = A & B; //判断是否进位
A = xor;
B = and << 1;
}
return A;
}
}