[刷題]劍指offer之不用加減乘除做加法

題目

題目:寫(xiě)一個(gè)函數(shù),求兩個(gè)整數(shù)之和,要求在函數(shù)體內(nèi)不得使用+、-、*、/四則運(yùn)算符號(hào)。

思路

雖然一看就知道是使用位運(yùn)算做這個(gè)題目,但還是沒(méi)做出來(lái)。

先理解一下10進(jìn)制是如何做加法的。例如5+7=12,分為3步。

  1. 先不考慮進(jìn)位值,5+7得到2.
  2. 再計(jì)算進(jìn)位值,個(gè)位上5+7的進(jìn)位為1,所以進(jìn)位為1*10=10 (要乘以10是因?yàn)閭€(gè)位上進(jìn)一相當(dāng)于加10).
  3. 重復(fù)1,2,直到?jīng)]有進(jìn)位制產(chǎn)生,就結(jié)束了。例如本題就是再次計(jì)算2+10,不考慮進(jìn)位為12,計(jì)算進(jìn)位得到0,所以最終結(jié)果為32.

對(duì)于10進(jìn)制,還是用到了加法和乘法運(yùn)算。

對(duì)于2進(jìn)制的計(jì)算也是一樣的,由于二進(jìn)制的特殊,還可以用位運(yùn)算替代加法運(yùn)算和乘法運(yùn)算。

按位異或:1^1=0 0^0=0 1^0=1 0^1=1

按位與 :1&1=1 0&0=0 1&0=0 0&1=0

所以按位異或等價(jià)于不考慮進(jìn)位的加法,按位與左移1位表示進(jìn)位值。

同樣考慮5+7,注:5=101,7=111,

  1. 先不考慮進(jìn)位值,101^111=010
  2. 計(jì)算進(jìn)位值,101&111=101,需要再左移一位,得到1010
  3. 重復(fù)1,2
    1. 先不考慮進(jìn)位值,0010^1010=1000
    2. 計(jì)算進(jìn)位值,0010&1010=0010,再左移一位,得到00100
    3. 重復(fù)1,2
      1. 先不考慮進(jìn)位值,01000^00100=01100
      2. 計(jì)算進(jìn)位值,01000&00100=0,左移之后還是0
      3. 因?yàn)檫M(jìn)位值為0,所以計(jì)算可以終止,最終結(jié)果為01100,即12

代碼

class Solution {
public:
    int Add(int num1, int num2)
    {
        while(num2 != 0){ //沒(méi)有進(jìn)位的時(shí)候可以停止迭代
            int temp = num1 ^ num2; //不考慮進(jìn)位的加法
            num2 = (num1 & num2) << 1; //進(jìn)位值儲(chǔ)存在num2中
            num1 = temp;//將不考慮進(jìn)位的加法儲(chǔ)存在num1中,下次再次計(jì)算num1+num2
        }
        return num1;
    }
};

總結(jié)

  • 加法運(yùn)算可以拆解成不考慮進(jìn)位的加法和只計(jì)算進(jìn)位值兩部分

我的segmentfault鏈接

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 網(wǎng)站亂碼問(wèn)題我們會(huì)經(jīng)常碰到,大多見(jiàn)于非英文的中文字符或其他字符亂碼,而且,這類問(wèn)題常常是因?yàn)榫幋a方式問(wèn)題,主要原因...
    波段頂?shù)?/span>閱讀 3,315評(píng)論 1 9
  • 第2章 基本語(yǔ)法 2.1 概述 基本句法和變量 語(yǔ)句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,501評(píng)論 0 13
  • 1 關(guān)鍵字 1.1 關(guān)鍵字的概述 Java的關(guān)鍵字對(duì)java的編譯器有特殊的意義,他們用來(lái)表示一種數(shù)據(jù)類型,或...
    哈哈哎呦喂閱讀 766評(píng)論 0 0
  • 我們知道,計(jì)算機(jī)最基本的操作單元是字節(jié)(byte),一個(gè)字節(jié)由8個(gè)位(bit)組成,一個(gè)位只能存儲(chǔ)一個(gè)0或1,其實(shí)...
    JxYoung閱讀 42,942評(píng)論 22 90
  • 題目描述: 寫(xiě)一個(gè)函數(shù),求兩個(gè)整數(shù)之和,要求在函數(shù)體內(nèi)不得使用+、-、*、/四則運(yùn)算符號(hào)。 本豬豬看見(jiàn)題目是毫無(wú)頭...
    Gxxx_xx閱讀 2,558評(píng)論 3 0

友情鏈接更多精彩內(nèi)容