計算機實現原理專題--二進制減法器(一)

先說說十進制減法,當被減數各列比減數各列小時,就須要從高位借個1過來,好比110-21=89,因爲0小於1所以從上一位借1變成10-1=9,而後高位變成10-2=8,最終結果就是89。測試

假設最可能是3位數的減法,爲了避免產生借位可將原表達式變成a-b=a-b+1000-1000=a-b+999+1-1000=a+(999-b)+1-1000。優化

那麼110-21=110+(999-21)+1-1000=110+978+1-1000=1088+1-1000=1089-1000=89;效率

若是是21-110=21+(999-110)+1-1000=21+889+1-1000=910+1-1000=911-1000;此時產生了借位,若是將原式變成a-b=a-b+999-999後可得21-110=910-999再將910和999兩數顛倒解得89,最後取89的負數就不會產生借位了。技巧

二進制的處理技巧與之相似,好比就進行8位二進制的減法,a-b=a-b+256-256=a-b+255+1-256=a+(255-b)+1-256。二進制

110-》0110_1110,21-》0001_0101,   110-21=0110_1110+(1111_1111-0001_0101)+0000_0001-1_0000_0000=0110_1110+1110_1010+0000_0001-1_0000_0000=1_0101_1001-1_0000_0000=0101_1001=89。方法

對於21-110=0001_0101+(1111_1111-0110_1110)+0000_0001-1_0000_0000=0001_0101+1001_0001+0000_0001-1_0000_0000=1010_0111-1_0000_0000到這一步時一樣會產生借位的狀況,此時須要相似於十進制的處理方法將原式變成a-b=a-b+255-255=1010_0110-1111_1111再將1010_0110和1111_1111顛倒解得0101_1001,最後取0101_1001的負數可得-89。因爲有些小技巧至於如何取負數將在下篇說明。im

最終看來減法的步驟比加法要繁雜點,按理減法的運行速度要慢於加法。實際親測以後,也印證了改結論,代碼以下:static

public static void main(String[] args) {
        // TODO Auto-generated method stub
        long start = System.currentTimeMillis();
        int k=0;
        for(long i=0;i<10000000000l;i++) {void

            //(1)
            k-=i;
        }
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }系統

能夠在(1)位置處改變符號進行測試,本人測得的結果是加法的效率會比減法快近1倍左右,值得注意的是對於自增和自減效率並不大,多是系統做了優化。

相關文章
相關標籤/搜索