位运算实现A+B

A+B单独的通过算术运算实现是很简单的,具体的代码操作如下所示:

public class Solution {
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    public int aplusb(int a, int b) {
        // write your code here
        int sum;
        sum = a + b;
        return sum;
    }  
}

下面主要讲的是通过位运算符实现相加操作。

思路:

不使用算术运算求和那么只能考虑直接在二进制位上进行位运算,事实上利用异或运算(^)和与运算(&)就能完成加法运算要做的事情,其中异或运算完成相加但是不进位,而与运算计算出哪些地方需要进位,在通过左移运算(<<)就可以完成进位操作了。

例子:

先举一个十进制加法的例子,比如4+6=10,如果不考虑进位得到的结果是2,只考虑进位得到的结果是8,加起来正好是10,对于二进制其实也是这样的,因此我们可以将加操作和进位操作分开,二进制不进位加法其实就是异或操作,而进位操作实际上就是两个数对应位都为1时的左移,考虑到进位次数有限,当进位为0时,加出来的就是答案了。

4 + 6 = 10
4的二进制:0000 0100
6的二进制:0000 0110
4 & 6 = 0000 0100  需要进位,左移一位,0000 1000
4 ^ 6 = 0000 0010

具体的代码操作如下所示:

public class Solution {
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b 
     */
    public int aplusb(int a, int b) {
        // write your code here
        if(b==0) return a;
        int sum = a ^ b; //加操作
        int carry = (a & b) << 1; //进位,左移一位操作
        
        //将加操作结果与进位操作结果相加作为最后的结果
        return aplusb(sum,carry); 
    }
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章