起因:
刷到一道算法题目: 计算A+B 的值 A和B都是32位的整数 题目有个挑战就是不用+运算符
第一反应:
public int plus(int a ,int b){
return a+b;
}
然后思考不用+运算符怎么计算
所谓前人种树,后人乘凉;看了看大家的解决办法 得到一些启发
public int plus(int a, int b) {
//withoutUp 代表异或的值 up表示按位与之后左移一位的值
int withoutUp = 0, up = 0;
withoutUp = a ^ b;
System.out.println(withoutUp);
up = (a & b) << 1;
System.out.println( up );
if (up != 0) {
return plus( withoutUp, up );
} else {
return withoutUp;
}
}
原理:
首先a和b都是32位的整数
把a和b转成二进制 然后在考虑计算
举个例子 3+2
3的二进制 : 0011 2的二进制表示:0010
正常相加 :
0011
0010
= 0101=5(10进制)
这个过程可以分为两步 :
第一步:不进位只考虑当前位的的结果 0001 这个值正好是a和b的异或的结果
第二步: 只考虑是否进位: 0010 说明倒数第二个需要进位 这个值 是a&b的结果 然后需要进位 那么左移一位成了 0100
这两个相加 就是考虑后进位的结果:
0001
0100
=0101
所以 : A+B = (A^B)+((A&B)<<1) 中间的+ 又可以用这个方法替换 直到没有进位了 那么值就是最后的结果