天天看點

從零開始學編碼7

      從零開始學編碼6中我們學習了怎麼一步步使用基本邏輯門建構出來一個8位二進制加法器,而這篇文章我們要通過加法器來實作減法運算,并且引出反碼和補碼的概念。

      國小的時候,我們學過各種算術技巧,口算,心算,指算,湊十法,找朋友等,有各種各樣的口訣。而其中有一個技巧是算減法時所用,例如:253-176這裡需要使用借位,但是如果使用:

            253-176+999+1-1000=253+(999-176)+1-1000=77

       通過上面的轉換,我們不使用借位也能計算出差。這種從一串9中減去一個數叫做對9求補數。這種計算方式的好處是無論減數是多少,計算對9的補數都不需要借位。

         這種技巧同樣可以用在二進制中,并且更加簡單,當然在二進制中需要減數從一串1中減去,結果稱為1的補數。

        這時253-176可以轉化為:11111101-10110000,然後使用求1補數的技巧,用11111111-10110000=01001111,這是我們觀察減數和結果,可以發現,隻需将二進制減數中的1變成0,0變成1即可。是以對1求補數也被稱為相反數或者反碼。

        我們将減數的反碼和被減數相加,然後結果加1,最後再減去100000000,結果就是1001101,即十進制的77。

        11111101+01001111=101001100

        101001100+1 = 101001101

        101001101-100000000=1001101

        通過上面的分析我們知道,使用加法來計算減法,主要用到的技巧是反碼,而反碼的特性是将1變成0,将0變成1,這和我們前面說過的反相器的表現是一緻的。那麼我們是不是可以使用上篇文章所抽象出來的8位加法器和一些反向器設計出來一個8位減法器呢?答案是肯定的。

       設計思路就是在加法器中新增一個用來求8位二進制數對1補數的電路,也就是說求8位二進制數反碼的電路,我們可以增加8個反向器。

從零開始學編碼7

8個反向器用來對二進制數取反

       能夠對輸入取反了,我們提出更加嚴格的要求,要求不但能做加法還能做減法的機器,這就要求隻有做減法時,反向器的輸入才有效,加法時,反向器的輸入無效。可以通過異或門的工作方式,将電路再次優化:

從零開始學編碼7

可以通過取反信号控制的電路

       上圖中,如果有疑惑,可以對照着前面文章中的異或門來分析這個電路。而将8個異或門合并起來組成一個器件,稱為“求補器”,如下圖所示:

從零開始學編碼7

求補器

       通過将一個求補器,一個8位加法器和一個異或門連接配接成一個支援加減法的加法器:

從零開始學編碼7

支援加減法的加法器

       圖中的三個SUB信号,就是加/減法轉換開關。

       當該信号為0時,其進行的是加法運算,最上面的SUB取值為0,B輸入的信号通過求補器時不進行取反,中間的SUB因為是加法求補電路不起作用,CI為0即可,最下面的SUB為0時,對CO結果沒有影響。

        當該信号為1時,其進行的是減法運算,最上面的SUB取值為1,B輸入的信号通過求補器時進行取反,中間的SUB為計算結果加上1,最下面的SUB信号隻有減數大于被減數表示負數的時候才有作用,而這個器件目前還不支援負數。

        上面讨論減法時,一直避免引入減數大于被減數的情況。如果這種情況下求出的結果是負數,而如何表示負數呢?

        有兩種方式:一種是将最高位定為符号位,如果為1就表示負數,如果為0就表示正數。還有一種方法是用補數來表示。二進制如果是有符号的8位二進制表示範圍是-128~127,如果是無符号的8位二進制所表示的範圍是0~255。

     上一篇:從零開始學編碼6(二進制加法器)                  下一篇:從零開始學編碼8(計數器)

繼續閱讀