371. Sum of Two Integers

这是一道比特运算题。

我们先假设a 和b两个数都为自然数,那么这道题就可以看成是连个字符串相加 Add Two Numbers 的延伸题,很简单了。

但是记住,一定不要对任何对结果有影响的数数进行开头或者结尾补零,因为正数和负数在表达方式上是不一样的。


class Solution {
public:
    int getSum(int a, int b) {
        int res=0, carry=0;
        for(int i=0;i<32;++i){
            int temp_a=(a>>i)&1;
            int temp_b=(b>>i)&1;
            res|=(temp_a^temp_b^carry)<<i;
            carry=(carry&temp_a)|(carry&temp_b)|(temp_a&temp_b);
        }
        return res;
    }
};

上段代码可以被ac。看其中的a和b,虽然被右移了i为,前面自动补0,但是前面补得0并不影响res的值。

至于这段代码为什么同样适用于负数,因为一般而言,负数用的书two's complimet. 请参考stack overflow 和youtube 的讲解,会非常清楚

http://programmers.stackexchange.com/questions/239036/how-are-negative-signed-values-stored

https://www.youtube.com/watch?v=Hof95YlLQk0


在youtube的视频中,那位大叔提到了overflow的情况,我觉得这道题也旭爷鹰派判断一下会不会overflow。 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值