# 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来实现的。

原文地址:https://www.cnblogs.com/xiaojintao/p/6358550.html