(有什么问题欢迎和博主讨论!!!)
原题链接:https://leetcode.com/problems/sum-of-two-integers/
这是一道简单的考查位运算的题目(还是能考一下程序员对位运算的了解的)
原题要求
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example:
Given a = 1 and b = 2, return 3.
翻译:
即要求你在不使用+ 和- 运算符的情况下,计算a b两数之和(就是要我们用位运算嘛~~)
ac代码
class Solution {
public:
int getSum(int a, int b) {
if(!b) return a;
return getSum(a^b,(a&b)<<1);
}
};
用到的知识点
相关计算 | 0和0 | 0和1 | 1和1 |
---|---|---|---|
& | 0 | 0 | 1 |
^ | 0 | 1 | 0 |
解释:
首先要意识到 位运算是从二进制层面来计算的
然后
- 第一步:求需要进位的地方的值 。与运算(即&)加上移位符(<<) 得出的 (a&b)<<1 ,求的是二进制的a和b相加后 ,每一位需要进位的值
- 第二步:求不需要进位的地方的值。异或运算(^) 得出的 a^b,求的是a和b相加后不用进位的地方的值
- 第三步:把所有位置的值相加。(a&b)<<1 加上 a^b 便是a加b的值了
- 注意:因为所有位置相加,依然会有需要进位的地方,所以我们用了getSum(a^b,(a&b)<<1),用了递归,重复计算直到(a&b)<<1 ==0 即都不需要进位的时候
具体样例过程 7+3
借此,贴出位运算知识点普及(以后补)