这是一个模拟计算机中实现加法器的程序,所有的数加法最后都是在计算机中用二进制的位操作实现
两个一相加会产生进位,所以这个用两个数相与然后左移一位实现进位操作
public class APlusB {
public static void main(String[] args) {
System.out.println(aplusb(10, 23));
}
/**
* 这是一个模拟计算机中实现加法器的程序,所有的数加法最后都是在计算机中用二进制的位操作实现
* 两个一相加会产生进位,所以这个用两个数相与然后左移一位实现进位操作
* 10,01,00这三种情况相加不会产生进位,所以用异或来实现
*
* eg:
* 十进制:4 + 7
* 转换成二进制:010 + 111
* 执行过程:
* 两数异或得a1:101
* 两数相与后左移一位得b1:100
* 将上一轮的计算结果再继续操作,直到进位数为0
* a1^b1得a2:001
* a1&b1<<1得b2:1000
* 继续递归:
* a2^b2=a3:1001
* a2&b2=b3:0000
* 此时进位数b3已经成为0也就说没有进位,则把a3返回
* @param a
* @param b
* @return
*/
private static int aplusb(int a, int b) {
if (b == 0)//直到没有需要进位的时候返回
return a;
int a1 = a ^ b;//两个数异或计算出不需要进位的数
int b1 = (a & b) << 1;//两数相与再左移一位计算出需要进位的数
return aplusb(a1, b1);//将需要进位的数和不需要进位按照相同的处理逻辑再处理
}
}