LeetCode日常刷题-371.两数之和

371. 两整数之和

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

示例:
若 a = 1 ,b = 2,返回 3。

致谢:
特别感谢 @fujiaozhu 添加这道问题并创建测试用例。


首先来看下Java和C语言的位运算表格:

含义 C语言 Java
按位与 a & b a & b
按位或 a | b a | b
按位异或 a ^ b a ^ b
按位取反 ~a ~a
左移 a << b a << b
带符号右移 a >> b a >> b
无符号右移   a>>> b

举个例子试试看,比如1 + 2,由于位运算都是基于二进制的也就是1 + 2 = (001) + (010),如果列竖式计算的话就是                

 
 
    0 0 1

+   0 1 0

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

1 + 3 = (001) + (011),如果列竖式计算的话就是 

    0 0 1

+   0 1 1

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

2 + 3 = (010) + (011),如果列竖式计算的话就是               

 
 
    0 1 0

+   0 1 1

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


最低位如果是两个1相加则要进一,如果一个是1,一个是0,则不进位。然后在做第二位的运算,以此类推,一直到没有进位为止。当同一位上的数字都是1的时候需要进位,进位以后下一位变成1,也就是3 & 1中等于1的地方是需要进位的,然后左一一位,使下一位变成1, 然后下一位需要加的数字就是 3 ^ 1。具体的一些步骤,详见:https://blog.csdn.net/goskalrie/article/details/52796360

class Solution {
    public int getSum(int a, int b) {
        //位运算实现加减法
        
        int res = 0;
        //不进位的加和
        int xor = a^b;
        
        //进位和
        int forward = (a&b)<<1;
        if(forward != 0){
            res = getSum(xor,forward);//循环处理 进位和+不进位加和
        }else {
            res = xor;
        }
        return res;
    }
}
class Solution {
    public int getSum(int a, int b) {
        while(a != 0) {
        int tmp = (a & b) << 1;
        b = a ^ b;
        a = tmp;
    }
    return b;
    }
}


猜你喜欢

转载自blog.csdn.net/zhang_yixuan_ss/article/details/80404812
今日推荐