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。
我们先假设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。
相关文章推荐
- Android 热补丁的一些总结
- 弦图的PERFECT ELIMINATION点排列
- 代码中设置光标显示在EditText文本末尾
- 代码中设置EditText输入类型
- Android JNI初步☞Java方法和native方法关联
- 设置Activity全屏显示
- C语言中%p,%u,%lu都有什么用处
- android实现消息推送的解决方案
- 设置一启动Activity就弹出键盘
- MVC模式的优缺点
- 第三个 android控件
- Google Analytics:为链接点击设定事件追踪的方法
- Activity启动模式
- aidl 进程间通信
- 23.Note the following structures in your database server:
- Android制作引导页和启动页
- UVA 11889 - Benefit
- CSS3实现手机网页3D切换效果
- 27 二叉搜索树与双向链表
- LeetCode 374. Guess Number Higher or Lower