371. 两整数之和

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

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

这道题原来的解法还是有问题,既然明确了不能用+,-运算符,自然是只能用位运算解决问题,也就是关于二进制的相加。
1 对于二进制的两个数加在一起,若没有进行进位,只要a和b的i为相同,那么总和的i位就是0,也就是抑或操作
2 若只进行进位,只要a和b的i-1位皆为1,总和的i位就为1,这就是位与操作后在进行位移操作
3 递归重复上述步骤,找到没有进位结束。

class Solution {
public:
    int getSum(int a, int b) {
         if(b == 0) {
             return a;
         }
        int sum = a ^ b; //相加但不进位
        int carry = ((unsigned int)(a & b)) << 1; //进位但不相加,考虑到负数的问题,需要转为无符号整数移位
            return getSum(sum, carry); //递归
            
    }
};
class Solution {
public:
    int getSum(int a, int b) {
         int sum = 0 ;
        int carry = 0;
        for(int i = 0;i< 32 ;i++){
            int a1 = a & 1;
            int b1 = b & 1;
            int val = 0 ;
            if(a1 == 0 && b1 == 0 && carry == 0){
                val = 0;
                carry = 0;
            }else if(a1 == 1 && b1 == 1 && carry == 1){
                val = 1;
                carry = 1;
            }else if(a1==0 && b1 ==0 || a1 ==0 && carry ==0 || b1 ==0 && carry ==0){
                val = 1;
                carry = 0;
            }else{
                val = 0;
                carry = 1;
            }
            val = val << i;
            sum = sum | val;
            a = a >> 1;
            b = b >> 1;
        }
        return sum;
    }
};
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值