menu

计算两个整数之和

题目:不使用运算符 +- ,计算两整数 a , b 之和。

示例一:
1 输入:a = 1, b = 2
2 输出:3
示例二:
1 输入:a = -2, b = 3
2 输出:1

解决方案

  • 题目说不能使用 +- ,那么我们就要使用其他方式来替代这两个运算符的功能。
位运算中的加法

我们先来观察一下位运算中的两数加法,其实只有下面四种:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 0 (进位1)

仔细观察,相同为0,不同为1, 这与异或运算的结果是一样的。

异或运算,与运算
  • 在位运算操作中,异或 的一个重要特性是 无进位加分 。我们先来看一个例子:
a = 5 = 0101
b = 4 = 0100

a ^ b 如下:

0 1 0 1
0 1 0 0
----------
0 0 0 1

a^b 得到了一个 无进位加法 结果,如果要得到 a+b 的最终值,我们还有找到 进位 的数,把这二者相加。在位运算中,我们可以使用与操作获得进位:

a = 5 = 0101
b = 4 = 0100

a & b 如下:

0 1 0 1 
0 1 0 0 
-----------
0 1 0 0

由计算结果可见, 0100 并不是我们想要的进位, 1 + 1 所获得的进位应该要放置在它的更高位,即在左侧位上,因此我们还要把 0100 左移一位,才是我们所要的进位结果。

  • 总结一下:
1  a + b 的问题拆分为(a和b的无进位结果)+(a和b的进位结果)
2 无进位加法使用异或运算计算得出
3 进位结果使用与运算和移位运算计算得出
4 循环此过程,直到进位为0

在Python中的特殊处理

  • 在python中,整数不是32位的,也就是说一直循环左移,并不会出现溢出的现象,这就需要我们手动对python中的整数进行处理,手动模拟32位int整型。

  • 具体做法是将整数对0x100000000取模,保证该数从32位开始到最高位都是0。

java代码实现:

public int getSum(int a,int b){
	return b==0 ? a:getSum(a^b,(a&b)<<1);
}
Date
Show extra info
Categories
Tags