不用+,-,*,/实现两数相加

题目写一个方法实现两数相加,但是不使用加减乘除运算符.

分析

加法不用+,-,*,/运算符,第一眼看上去会不知所措,但是要知道,位运算是可以使用的,此题的目的就是使用位运算来实现加法.

首先,分析加法的本质是什么:例如5加上17等于22,第一步17加5相加但是不进位,得到12;第二部找到进位10;第三步12加上10得到22.那么这种方法对于二进制是否可用呢?

5的二进制为101,17的二进制为10001.同样分为3步,第一步101加上10001且不考虑进位得到10100;第二步找出进位10;第三步相加的10110,换算成十进制得到22.所以二进制也是符合这种计算方法.然后来分析每一步如何用位运算来实现.

第一步可以看出结果是两个数的异或运算,第二步是两个数做&运算然后结果再右移一位,最后一步是第一步和第二步结果相加,相加也遵循第一步第二步的方法,一直到第二步运算结果为0为止(任何数和0相加还为原来的数).

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
public static int add(int a , int b){
int sum,carry;
do{
sum = a ^ b; //第一步

carry = (a & b)<<1; //第二步

a = sum; //准备第三步,一直到b=0为止.
b = carry;
} while(b != 0);

return a;
}

总结

思考题:不用第三变量实现a,b两个变量的数值交换.
例如:a=3,b=4;
第一步:a = a + b; a=7
第二步:b = a - b; b=3
第三步:a = a - b; a=4
完成.

或者
a = a ^ b;
b = a ^ b;
a = a ^ b;