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