编程中的位——不用加法实现两个数的和

                              不用加法实现两个数的和

题目

给出两个整数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走了遍代码还是没有发现什么结果哭,接着找谷歌粑粑,找度娘,参考了别人的解释,写出上面的思路,看官如有雷同,请参照我上面的思路写一遍便会有一个体会,再看代码就明白其中的含义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值