[LintCode]1.A + B 问题 位运算

来源:互联网 发布:卸载软件工具下载 编辑:程序博客网 时间:2024/06/01 09:28

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。

 注意事项

你不需要从输入流读入数据,只需要根据aplusb的两个参数a和b,计算他们的和并返回就行。

说明

a和b都是 32位 整数么?

  • 是的

我可以使用位运算符么?

  • 当然可以
样例

如果 a=1 并且 b=2,返回3

思路:利用位运算来解决A+B的问题,可以将此问题转化为解决不进位相加和进位(carry bit)的两部分问题:

1. 首先是不进位相加:_A = A^B 先对A和B进行异或运算(XOR manupitation) , A 和B 中两位不相同的变为1,相同的变为 0, 同为1是不进位

2. 其次是进位  _B =(A&B)<<1

所以 A+B = A^B + (A&B)<<1

3.在循环中(A&B)<<1 的目的是将要进位的1一直向左移动,之后与新生成的_A进行异或运算,来进行进位运算的模拟(这一步就是进位)

4. 直到将所有的1全部向左移位为0

class Solution {public:    /*     * @param a: An integer     * @param b: An integer     * @return: The sum of a and b     */    int aplusb(int a, int b) {       while (b != 0) {            int _a = a ^ b;            int _b = (a & b) << 1;            a = _a;            b = _b;        }        return a;    }};



原创粉丝点击