1 前言
??本文是基于《編碼》狗唉、《穿越計(jì)算機(jī)的迷霧》兩部著作進(jìn)行讀后整理的記錄性博客耍群。對(duì)書(shū)中較為重要的內(nèi)容進(jìn)行歸納整理進(jìn)行二次創(chuàng)作香椎,略去了繁瑣的講述細(xì)節(jié)乐埠,力求簡(jiǎn)明扼要抗斤。
編碼:一種由若干符號(hào)和規(guī)則組成的系統(tǒng),用來(lái)向計(jì)算機(jī)表述指令丈咐。
2 正文
2.1 如何實(shí)現(xiàn)減法
??加法和減法在某些方面相互補(bǔ)充瑞眼,但在機(jī)制方面這兩個(gè)運(yùn)算則是不同的。加法是始終從兩個(gè)加數(shù)的最右列向最左列進(jìn)行計(jì)算的棵逊。每一列的進(jìn)位加到下一列中伤疙。在減法中沒(méi)有進(jìn)位,而是有借位——一種與加法存在本質(zhì)區(qū)別的麻煩機(jī)制辆影。
??要解決這個(gè)問(wèn)題徒像,首先從最右列著手。我們看到蛙讥,6 是大于 3 的厨姚,因此從 5 上借 1,再用 13 減去 6键菱,得到結(jié)果為 7谬墙。由于我們已經(jīng)在 5 上借了 1,因此经备,現(xiàn)在實(shí)際上那一位是 4拭抬,而 4 是小于 7 的,因此繼續(xù)從 2 上借 1侵蒙,14 減 7 結(jié)果為 7造虎。而由于在 2 上借了 1,實(shí)際上這一位是 1纷闺,從中減去 1算凿,結(jié)果為 0。因此犁功,最后的結(jié)果應(yīng)為 77氓轰。
??如何才能通過(guò)一連串邏輯門(mén)來(lái)實(shí)現(xiàn)這個(gè)反邏輯呢?
??然而浸卦,我們并不打算這樣做署鸡。相反,我們打算用一個(gè)小技巧來(lái)讓減法不涉及借位。為了避免借位靴庆,首先要從 999 中減去減數(shù)时捌,而不是從原來(lái)的被減數(shù)中減去減數(shù)。從一串 9 中減去一個(gè)數(shù)叫做對(duì) 9 求補(bǔ)數(shù)炉抒。176 對(duì) 9 的補(bǔ)數(shù)是 823奢讨。
??計(jì)算出減數(shù)對(duì) 9 的補(bǔ)數(shù)后,將補(bǔ)數(shù)與原來(lái)的被減數(shù)相加:
??最后再將結(jié)果加 1焰薄,并減去 1000拿诸。
??到此,我們就得到了結(jié)果蛤奥。答案與先前的相同佳镜,而且沒(méi)有用到借位。
??我們按照前面的步驟梳理一下計(jì)算過(guò)程凡桥。原題目是這樣的:
??這個(gè)式子于下面的式子等價(jià):
??我們用兩個(gè)減法和兩個(gè)加法來(lái)替代一個(gè)減法蟀伸,而在這個(gè)過(guò)程中避免了煩瑣的借位。
??如果減數(shù)大于被減數(shù)會(huì)怎么樣呢缅刽?例如以下問(wèn)題:
??如果希望求解這個(gè)問(wèn)題而不使用借位的話啊掏,就要采用與之前稍微不同的方法。首先要像前面一樣衰猛,用 999 減去減數(shù) 253迟蜜,計(jì)算出對(duì) 9 的補(bǔ)數(shù):
??把該數(shù)對(duì) 9 的補(bǔ)數(shù)與被減數(shù)相加:
??在前面的例子中,下一步應(yīng)該加 1啡省,并減去 1000 來(lái)得到最終結(jié)果娜睛。但是在這里,這種方法并不適用卦睹。因?yàn)槟銜?huì)遇到 923 減去 1000 的情況畦戒,這又導(dǎo)致了借位。由于我們之前已經(jīng)加了 999结序,這里再減去 999:
??到這里障斋,我們會(huì)意識(shí)到這個(gè)問(wèn)題的結(jié)果是負(fù)數(shù),因此需要將減數(shù)與被減數(shù)交換徐鹤,用 999 減去 922(也即改成 999 - 922垃环,結(jié)果加上負(fù)號(hào))。這里沒(méi)有用到借位返敬,結(jié)果與我們期望的相同:
??同樣我們來(lái)回顧總結(jié)一下上述的計(jì)算過(guò)程遂庄。原題目是這樣的:
??這個(gè)式子于下面的式子等價(jià):
??同樣的技巧可以用于二進(jìn)制數(shù)中,而且實(shí)際上這要比十進(jìn)制數(shù)簡(jiǎn)單救赐。
實(shí)際上這上面介紹的針對(duì)減法的用于避免借位的計(jì)算技巧主要是保持計(jì)算過(guò)程中永遠(yuǎn)是對(duì)位最大的數(shù)(999)減去小的數(shù)涧团,這樣的話在相減的過(guò)程中就避免了要向前面借位只磷,可以直接減掉经磅。而由于是十進(jìn)制下所以對(duì)位最大的數(shù)是 9泌绣,利用對(duì)位最大數(shù)去減去任何數(shù)都不涉及借位的操作。而對(duì)于二進(jìn)制下预厌,對(duì)位最大的數(shù)是 1阿迈,也即計(jì)算出該數(shù)在二進(jìn)制下對(duì) 1 的補(bǔ)數(shù)。111 在二進(jìn)制下的作用就相當(dāng)于十進(jìn)制下的 999轧叽。
??將上面提到的 254 - 176 轉(zhuǎn)化為二進(jìn)制數(shù)進(jìn)行計(jì)算苗沧,那么問(wèn)題變?yōu)椋?/p>
??同樣的,求補(bǔ)數(shù):
??在求對(duì) 1 的補(bǔ)數(shù)時(shí)炭晒,只需將原來(lái)的二進(jìn)制數(shù)中的 1 變?yōu)?0待逞,將 0 變?yōu)?1 即可。因此對(duì) 1 求補(bǔ)數(shù)有時(shí)也會(huì)稱(chēng)為相反數(shù)(negation)或反碼(inverse)网严。在前面的內(nèi)容中我們介紹過(guò)反向器识樱,它的作用就是將 0 變?yōu)?1,將 1 變?yōu)?0震束。
??將減數(shù)對(duì) 1 的補(bǔ)數(shù)與被減數(shù)相加:
??將上式所得結(jié)果加 1怜庸,減去 100000000(即 256):
??我們把這兩個(gè)數(shù)顛倒位置后再做一遍。在十進(jìn)制中垢村,減法題目對(duì)應(yīng)于 176 - 253割疾。而用二進(jìn)制表示為:
??計(jì)算過(guò)程如下,最后計(jì)算結(jié)果加上負(fù)號(hào):
??了解了上述計(jì)算技巧后嘉栓,我們可以開(kāi)始嘗試實(shí)現(xiàn)一下減法的操作宏榕。下面構(gòu)建的減法器適用于計(jì)算結(jié)果為正數(shù)的減法操作。
??針對(duì)求補(bǔ)數(shù)的計(jì)算過(guò)程侵佃,二進(jìn)制數(shù)對(duì)1求補(bǔ)數(shù)相當(dāng)于對(duì)其每位取反麻昼,因此我們可以利用反向器來(lái)實(shí)現(xiàn)相應(yīng)的操作。以 8 為二進(jìn)制減法為例趣钱,我們計(jì)算 8 位二進(jìn)制數(shù)補(bǔ)數(shù)的時(shí)候可以簡(jiǎn)單地應(yīng)用 8 個(gè)反向器涌献。
??問(wèn)題是,該電路只會(huì)對(duì)輸入求反首有,而我們要的是一臺(tái)既能做加法又能做減法的機(jī)器燕垃,因此就要求該電路當(dāng)且僅當(dāng)進(jìn)行減法運(yùn)算時(shí)才實(shí)現(xiàn)反轉(zhuǎn)。電路可以改造為如下圖所示井联。
??標(biāo)記為 “取反” 的信號(hào)將被輸入到每一個(gè)異或門(mén)中卜壕。回想一下異或門(mén)的工作方式烙常,如下表所示轴捎。
??因此鹤盒,如果 “取反” 信號(hào)是 0,則 8 個(gè)異或門(mén)輸出與輸入相同侦副。例如侦锯,如果輸入是 01100001,那么輸出也為 01100001秦驯。如果 “取反” 信號(hào)為 1尺碰,則輸出信號(hào)反置。例如译隘,如果輸入為 01100001亲桥,輸出則為 10011110。
??將 8 個(gè)異或門(mén)合并起來(lái)畫(huà)成一個(gè)器件固耘,稱(chēng)為求補(bǔ)器(One’sComplement)题篷,如下所示。
??將一個(gè)求補(bǔ)器厅目,一個(gè) 8 位二進(jìn)制加法器和一個(gè)異或門(mén)做如下連接番枚。
??注意,這里三個(gè)信號(hào)都標(biāo)識(shí)為 “SUB”璧瞬,這就是加/減法轉(zhuǎn)換開(kāi)關(guān)户辫。當(dāng)該信號(hào)為 0 的時(shí)候,其進(jìn)行的是加法運(yùn)算嗤锉,為 1 時(shí)進(jìn)行的則是減法運(yùn)算渔欢。在減法中,輸入 B(第二排開(kāi)關(guān))在送入加法器之前瘟忱,需先通過(guò)求補(bǔ)電路進(jìn)行取反奥额。此外,在做減法時(shí)访诱,我們通過(guò)設(shè)定 CI(進(jìn)位輸入)為 1 來(lái)使得結(jié)果加 1垫挨。而在加法中,求補(bǔ)電路將不起作用触菜,且輸入 CI 為 0九榔。
??加法器的 SUB 信號(hào)和 CO(進(jìn)位輸出)輸出作為異或門(mén)的輸入來(lái)控制表示上溢/下溢的燈泡。如果 SUB 信號(hào)為 0(表示進(jìn)行加法運(yùn)算)涡相,則當(dāng)加法器 CO 輸出為 1 時(shí)燈亮哲泊,意思是加法計(jì)算結(jié)果大于 255。
??當(dāng)進(jìn)行減法運(yùn)算的時(shí)候催蝗,如果減數(shù)(輸入 B)小于被減數(shù)(輸入 A)切威,這時(shí)加法器的 CO 輸出為 1。這表示減法的最后一步要減去 100000000丙号。也就是說(shuō)減數(shù)要大于被減數(shù)先朦,結(jié)果為負(fù)缰冤。上面所示器件現(xiàn)在還不能表示負(fù)數(shù)。因此喳魏,上溢/下溢指示燈僅在加法器的 CO 輸出為 0 時(shí)才會(huì)亮起棉浸。
3 小結(jié)
??編碼:實(shí)現(xiàn)減法篇對(duì)二進(jìn)制加法器部分進(jìn)行了拓展,討論了如何利用全加器實(shí)現(xiàn)了二進(jìn)制的減法操作截酷。為了精簡(jiǎn)內(nèi)容刪減了部分較為詳細(xì)的書(shū)寫(xiě)涮拗,僅作為整理總結(jié)乾戏。