不用加法实现两个数的和
题目
给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符
代码:
public int aplusb(int a, int b) {
while (b != 0) {
int _a = a ^ b;// 计算不加进位的结果
int _b = (a & b) << 1;// 计算本次应当加上的进位,在下轮中加上
a = _a;// 更新a值
b = _b;// 更新b值
}
return a;
}
@Test
public void test() {
System.out.println(aplusb(5, 7));
}
思路解释:
请看官先手撸出5+7的二进制计算结果,然后再放慢点,放慢整个过程就是如下的过程(ps:参考十进制):
* 计算 5+7 的过程:
* 5=0101
* 7=0111
* 二进制的计算完整过程:
* 0101
* +
* 0111
* ——————
* 0010 -----不加进位的结果
* +
* 1010 -----由与运算和位移运算得到进位结果
* ——————
* 1000 -----上一轮的两数相加,不加进位的结果
* +
* 0100
* ——————
* 1100
看官如果手撸完了,对上面的过程没有疑问,接下来可以看看另外两个概念:
1、异或(^)运算符的特性
计算机中的异或运算符(^)特征(记住其还有个特性称为:二进制中不进位的加法):
1 ^ 1 = 0
0 ^ 0 = 0
1 ^ 0 = 1
0 ^ 1 = 0
2、逻辑与运算 VS 二进制两数相加
两个数相加的发生进位的位置一定是逻辑与运算位置为1的位置(MD有点绕),再换句话,就是逻辑运算只有同一位置都为1的时候为结果为1,如果两个数相加,也会发生进位。举个栗子:5+7
1 0 1 0
&
0 1 1 1
———————————
0 0 1 0 ----1.逻辑与的运算结果中为1的位置恰好也是此次运算应当进位位置,2.该数再左移一位恰好为进位的数(<<1)
题外话:
1、我最初是没有解出这道题,包括看别人的代码也是没有明白,为什么要用while循环来做,我自己也用5和7走了遍代码还是没有发现什么结果,接着找谷歌粑粑,找度娘,参考了别人的解释,写出上面的思路,看官如有雷同,请参照我上面的思路写一遍便会有一个体会,再看代码就明白其中的含义。