问题是不用加号 写出a+b的结果
假设a是5 b是6
首先考虑用位用算
这里有几个位运算符号 ^ & >>
- ^的意思是位异或与 就是把a和b的各个位进行异或运算 同为1或0时为0 否则是1
比如 5用2进制表示是 0101
6用2进制表示是 0110
他俩异或运算 0011
相当于是没有进位的加 - &是且 只有上下都是1时才为1 否则为0
5和6的且运算结果是0100
相当于是记录 哪位是该进位的 - <<是左移位
比如 5<<1
0101 << 1 左移一位变成 01010 相当于5*2
所以a+b的思路就是 (a^b) + (a&b)<<1
然后这个+ 可以继续 分解 直到 (a&b)没有进位
此时 (a^b)的结果即为a+b的值
代码如下:
非递归
public int aplusb(int a, int b) {
while(b!=0){
//没有进位的+的结果
int sum = a ^ b;
//有进位的值
int carry = (a & b)<<1;
a = sum;
b = carry;
}
return a;
}
递归`
public int aplusb(int a, int b) {
if(b!=0){
return aplusb(a^b,(a&b)<<1);
}else{
return a;
}
}