1.A+B问题(位运算)-LintCode

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/BruceYan63/article/details/79143385


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);
    }
};

猜你喜欢

转载自blog.csdn.net/BruceYan63/article/details/79143385