略
题目写一个方法实现两数相加,但是不使用加减乘除运算符.
分析
加法不用+
,-
,*
,/
运算符,第一眼看上去会不知所措,但是要知道,位运算是可以使用的,此题的目的就是使用位运算来实现加法.
首先,分析加法的本质是什么:例如5加上17等于22,第一步17加5相加但是不进位,得到12;第二部找到进位10;第三步12加上10得到22.那么这种方法对于二进制是否可用呢?
5的二进制为101,17的二进制为10001.同样分为3步,第一步101加上10001且不考虑进位得到10100;第二步找出进位10;第三步相加的10110,换算成十进制得到22.所以二进制也是符合这种计算方法.然后来分析每一步如何用位运算来实现.
第一步可以看出结果是两个数的异或运算,第二步是两个数做&
运算然后结果再右移一位,最后一步是第一步和第二步结果相加,相加也遵循第一步第二步的方法,一直到第二步运算结果为0为止(任何数和0相加还为原来的数).
代码实现
1 | public static int add(int a , int b){ |
总结
思考题:不用第三变量实现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;