要实现不能用加号求两个数的和,我们可以用位运算符。
我们先来代码:
static int add(int a, int b){
//思路: a+b=a^b + (a&b)<<1;其中a^b是不考虑进位的加.
//只有位相同才有进位所以(a&b)<<1则是进位的值,
//每进行一次操作,进位末尾补0,也就是说,最多进行b的二进制位数次操作即可完成计算
if (b == 0)
return a;
return add(a ^b, (a&b) << 1);
}
}
实现的原理是
a + b = a^b + a&b << 1
原理就是假定我们随便给两个数,例如 5和7
a ^ b =
101
^ 111
-------
010
a & b << 1 =
101
& 111
-------
101
101 << 1 = 1010
然后, a = 010 , b = 1010
a ^ b =
0101
^ 1010
--------
1111
a & b << 1
0101
& 1010
--------
0000
0000 << 1 = 00000
返回a,也就是1111 = 15
其实 ^ 就是不算进位的加法运算
&后<<1也就是进的位,然后一直到位数等于0,也就是没有进位的时候,a的值就是加法成功的值。