问题:给出两个整数a和b, 求他们的和, 但不能使用 +
等数学运算符。
理解:不运用运算符只能利用利用计算机的位运算。
思路:根据位运算,二进制中满2进1,例:2+3=0010+0011=0101,第一步先判断A和B相加是否有进位,如果没有直接为A|B(或运算),如果有第一步先作为异或运算(不考虑进位相加),2+3=0001,应该进位的值为A&B(和运算)再向左移一位,0100,将进位和刚才结果相加如果还有进位重复之前操作,如果没有进行或运算为结果。
class Solution {
public:
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
int aplusb(int a, int b) {
// write your code here
int c = 0,d = 0;
while((a&b) != 0){
c = a^b;
d = (a&b)<<1;
a = c;
b = d;
}
return a|b;
}
};
Tips:
1.位运算符的优先级
1
|
~
|
2
|
<<、>>
|
3
|
&
|
4
|
^
|
5
|
|
|
6
|
&=、^=、|=、<<=、>>=
|
&和运算:两个都是1则为1
^异或运算:相同为0不同为1
|或运算:有1则为1全0为0
>> <<:右移 左移运算符