计算两个整数之和
-
date_range 19/08/2019 03:25 info
题目:不使用运算符 +
和 -
,计算两整数 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);
}