lintcode-1. A + B Problem

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

欢迎访问我的lintcode题解目录https://blog.csdn.net/richenyunqi/article/details/81149577

 

算法设计:

这是一道考察位运算的题目。如何利用位运算求解两数之和呢?

在不考虑进位的情况下两数之和可以用异或运算^来表示,例如0+1的和就可以通过0^1=1得到;进位可以利用与运算&再左移一位来表示,例如1+1可以用1&1=1,1左移一位1位=10,十进制即为2得到。

下面以7+1=8,二进制表示为111+001=1000为例:

 

  1. 在不考虑进位的情况下111^001=110;进位为111&001=001,将进位左移一位变为010
  2. 在不考虑进位的情况下110^010=100;进位为110&010=010,将进位左移一位变为100
  3. 在不考虑进位的情况下100^100=000;进位为100&100=100,将进位左移一位变为1000
  4. 在不考虑进位的情况下0000^1000=1000;进位为0000&1000=0000,进位为0,算法结束。此时得到了两数之和1000

非递归的C++代码:

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

递归C++代码:

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 b==0?a:aplusb(a^b,(a&b)<<1);
    }
};
阅读更多

扫码向博主提问

日沉云起

用最短的代码,写最快的算法
  • 擅长领域:
  • 算法
去开通我的Chat快问
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页