1. A+B问题(位运算)
题目来源:LintCode
题目:
给出两个整数a和b, 求他们的和, 但不能使用
+
等数学运算符。
你不需要从输入流读入数据,只需要根据apsulb的两个参数a和b,计算他们的和并返回就行。
a和b都是 32位
整数, 可以使用位运算符.
样例
如果
a=1
并且 b=2
,返回3
难度级别:中
使用的编程语言:
C++
思路分析:
根据题意, 不能用'+'等数学运算符, 我马上想到用位操作来实现加法的功能.
C++有如下几个为操作符:
~:按位求反
<<:左移运算符
>>:右移运算符
&:按位与
^:按位异或
|:按位或
我的思路是这样的:
0+0=0
1+0=1;
1+1=0;
0+1=1;
在不考虑进位的情况下, 对每个位的相加可以通过 ^ 运算符(按位异或)来完成.
假设有两个给定的数 a和b.
1.先考虑不进位的情况: a^b
接下来考虑进位:(1表示进位)
1+1 = 1;
1+0 = 0;
0+0 = 0;
0+1 = 0;
不难发现, 对每个位的相加进位与否可以通过 & 运算符(按位与)来完成.
由于要进一位, 所以需要左移一位, 即可得:
2.考虑进位的情况: (a&b)<<1;
最终结果 = 不进位的情况 + 进位时的情况.
实现代码:
class Solution {
public:
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
return (a^b)+((a&b)<<1);
}
};