# LeetCode 371 Sum of Two Integers
Calculate the sum of two integers a and b, but you are not allowed to use the operator
+
and-
.Example:
Given a = 1 and b = 2, return 3.
哎,这道题我想到了应该使用位运算来实现,但是对计算机底层的原理不了解,所以没想出来,这里做下笔记。
该题目涉及到两个逻辑运算操作,&
和^
。
看看一个例子,19+7:
&
表示逻辑_与_运算,即
10011
&00111
=00011
^
表示逻辑_异或_运算,即
10011
^00111
=10100
19+7:
10011
+00111
=11010
这么看来好像没啥关系啊?
好了,我们来好好观察一下,对于二进制数的加减法,是不是如果对应位上的值相同,那么它的结果对应的位置就计算为0(这里先不考虑借位关系)?
如果不考虑借位,那么任意两个二进制数无论加减,它们的结果都应该是它们逻辑_异或_运算的结果吧。
同样,我们观察一下上面的逻辑_与_,只有对应位置相同,且都是1,它的结果才是1,这个正好就是每一位运算产生的进位值吗?
也就是说,我们通过这两种运算,将它的和分解开来了,可以认为是将结果信息分开在了两个变量里面。
而要把这两个结果合并为和值,我们只需要不断的这么计算,知道进位值变为0,不就是我们所要的结果吗?
public int getSum(int a, int b) {
int carry = a&b;//得到进借位的结果
int result = a^b;//得到当前的结果值,就叫基础值好了
int tmpc;//临时变量
while(carry!=0){//开始循环,知道进借位的值变为0,说明我们将所有的信息都存入result了
tmpc = carry<<1;//在使用时,要记得,不论是进位,还是借位,都是向高位计算
carry = result & tmpc;//取得新的进借位结果
result = result ^ tmpc;//新的基础值
}
return result;
}
抽时间得看看计算机的基础知识,其实位运算是非常重要的,毕竟,计算机的任何复杂运算都是通过位运算操作0,1来实现的。