2016.9.11 Leetcode 371. Sum of Two Integers

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

解法一
思路:這里用到了一個半加法的思想, 即兩位單獨的位相加其結(jié)果可以用異或得到, 進位可以用與得到. 然后對于兩個數(shù)字來說同樣可以延伸這個思想.

舉個例子: 11+5, 其二進制形式為11: 1011, 5: 0101

  1. 那么兩個位置都為1的地方就需要進位, 所以進位值就為0001. 原位置兩個數(shù)相加的結(jié)果為那個位置值的異或即1110, 即兩個位置值如果不一樣就為1, 一樣的話要么兩個位置原來值都為0結(jié)果也為0, 要么進位, 那么結(jié)果依然是0.

  2. 接下來就要把進位位和下一位相加, 所以進位值左移一位,即0001變?yōu)?010, 重復上面操作可得新的進位值為0010, 原位置異或(即相加)結(jié)果為1100,而1110和0010相與之后,變?yōu)?010,左移一位,是0100,依次繼續(xù)。

  3. 繼續(xù)重復上面操作直到進位為0, 可得到最終結(jié)果10000, 即16

class Solution {
public:
    int getSum(int a, int b) {
        int r = b;
        for(;a;b=r){
            r^=a;//把每次a和b的異或賦值給r,然后再賦值給 b,類似于1110,1100
            a=(a&b)<<1;//每次 a與 b的相與左移一位,賦值給 a,類似于0010,0100
        }
        return r;
    }
};

這種思想也可以有另一種寫法。

int getSum(int a, int b){
      while(a!=0){
            int temp=(a&b)<<1;
            b^=a;
            a=temp;
      }
      return b;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 題目描述:Calculate the sum of two integers a and b, but you a...
    Fluxay閱讀 449評論 0 0
  • 網(wǎng)站亂碼問題我們會經(jīng)常碰到,大多見于非英文的中文字符或其他字符亂碼,而且,這類問題常常是因為編碼方式問題,主要原因...
    波段頂?shù)?/span>閱讀 2,957評論 1 9
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,769評論 0 33
  • 1 關(guān)鍵字 1.1 關(guān)鍵字的概述 Java的關(guān)鍵字對java的編譯器有特殊的意義,他們用來表示一種數(shù)據(jù)類型,或...
    哈哈哎呦喂閱讀 673評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399