lintcode 刷题第一问:给出两个整数a和b, 求他们的和。 总结归纳下 解法及原理


链接 http://www.lintcode.com/zh-cn/problem/a-b-problem/

A + B 问题

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

 

举两个例子   

例子一:  整数 5   和 整数 17  

例子二:  整数 20  和 整数 2

 

需知: 异或运算的运算方式 是       二进制   0 ^ 0 = 0 ,  1 ^ 1 = 0 , 0 ^ 1 = 1 ,  1 ^ 0 = 1    ;  看完解题步骤 回来看这里 ,就会明白 异或运算 是忽略进位的 加法

    与运算的运算方式 是           二进制  0 & 0 = 0 ,  1 & 1 = 1, 0 & 1 = 0 ,  1 & 0 = 0   ;  与运算是为了计算进位的 结果。 例如 结果 0001 << 1 =  0010  =  2(十进制) ,当进位结果左移一位 仍然是 0000 0000 时 ,意味加法无进位。

 

解题步骤 :  

 1. 二进制 5 和 二进制 17 进行 异或运算(^),忽略进位。得出 结果 x1 。含义是 二进制异或运算 计算两个二进制忽略 进位的加法结果。

 2. 二进制 5 和 二进制 17 进行 与运算(&),得出结果 再 向左移一位 , 得出结果 x2。 含义是 二进制与运算 计算出 两个二进制数相加 是否出现进位 现象

 3. 将结果x1和结果x2相加 就是 两个整数相加的结果。

  代码 如下 

class Solution {  
public:  
    /* 
     * @param a: The first integer 
     * @param b: The second integer 
     * @return: The sum of a and b 
     */  
    int aplusb(int a, int b) {  
        // write your code here, try to do it without arithmetic operators.  
        if(a==0)return b;  
        if(b==0)return a;  
        int x1 = a^b;  
        int x2 = (a&b)<<1;  
        return aplusb(x1,x2);  
    }  
};  

  

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM