您的位置:首页 > 其它

371. Sum of Two Integers

2016-07-18 01:01 183 查看
这是一道比特运算题。

我们先假设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。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: