標籤:

二進位是如何將加減乘除變換為加法實現的?加法是如何由邏輯運算與、或、異或來實現的?


加法是由基本門電路實現的

這個是全加器

其實基本都是數學知識

努力填坑中

  • 半加器(英語:half adder)電路是指對兩個輸入數據位相加,輸出一個結果位和進位,沒有進位輸入的加法器電路。 是實現兩個一位二進位數的加法運算電路。

我們只需要一個異或門、一個與門即可實現。

  • 全加器英語名稱為full-adder,是用門電路實現兩個二進位數相加並求出和的組合線路,稱為一位全加器。一位全加器可以處理低位進位,並輸出本位加法進位。多個一位全加器進行級聯可以得到多位全加器。

我看的是《計算概論A》,感覺這個課程不錯,我貼個課程鏈接 https://www.coursera.org/course/pkuic

在計算機基礎知識部分,我們將為大家解答一些與計算機程序設計相關的基礎問題,例如,「計算機為什麼能夠進行計算?」,「計算機程序在計算機中是如何運行的?」,「計算機的發展規律是什麼?」,「下一代的計算機將會是什麼樣子?」等等。我們希望通過對這些問題的解答,達到兩個目的:A 培養起大家對計算機科學的興趣;B 幫助大家建立起學習計算機科學所需要的「背景知識框架」。

本課程的內容針對「信息科學技術」專業的一年級本科生而設,我們不要求不假設選課學生有任何信息科學技術相關專業的知識背景,也不要求有任何的程序設計知識背景


/***大家快閃開,我要裝B了***/

乘除法已經更新了演算法,浮點數計算下次再寫……

樓上@李震的加法器其實已經回答了大半的問題了。

對於一般的計算機來說,有兩種運算,一種叫做「整數運算」,另一種叫做「浮點小數運算」(某些特殊用途的單片機還有「固定小數點小數運算」)

【整數運算】

整數運算的基礎就是加法和位移。這兩種運算的組合囊括了五種基本的計算(加,減,乘,除,求余)

ps:除了加減法和位移操作之外,其他演算法基本都是通過彙編來實現的。能用電路直接實現的計算只有(與或非和它們的衍生,例如加法,異或)

在介紹運算方法之前,首先需要了解以下的概念從而了解計算機記錄整數的方法。

比特(bit):包含電流通/斷信息的一個單位。又被稱為「位」。一個「位」能表示二進位數的一個位。

位元組(byte):由8個比特組成的單位,一個位元組共能表示2^8=256個數。

補數:2個數A,B相加等於C,那麼就說A是B的C補數。例如2是8的10補數。

為了方便描述計算機處理的二進位數據,人們也會用8進位和16進位來書寫2進位數。記住0-15所對應的2進數和16進數的寫法對計算機等級考試很有幫助。

例如,對於一個8位整數:

10進位:10

2進位:0000 1010

8進位:0012(3位的2進位數和1位的8進數等價)

16進位:0A(4位2進數和1位16進數等價)

一個8位(無符號)整數能表示的範圍是「0~255」,共256個數。

加法:

加法運算就是將兩個數通過加法器進行相加和進位。加法器的原理這裡就不贅述了。

例如,對於2個8位整數「10」和「15」

0000 1010 + 0000 1111 = 0001 1001

0001對應16進數「1」,1001對應16進數「9」,於是直接答案可以寫作16進數的「19」,也就是16+9=25。

再例如,對於2個8位(無符號)整數「3」和「254」,有

0000 0011+1111 1110這樣得到的結果理應是「1 0000 0001」。但是,因為限定了「8位整數」這個條件,所以結果第九位的1就被計算機吞掉了。於是算出的最終結果是0000 0001。也就是「1」。

減法:為了減少計算機設計的複雜程度,工程師們人為規定了一個2進數的2補數為負數。同時規定一個整數的最上位的比特表示正負號(正數最上位為0,負數為1)。

因為最上位挪去表示正負號了,所以8位有符號整數的表示範圍是「-128~127」,共256個數(因為0隻有一個而且算正數,所以負數比正數多一個)

2補數的計算方法:

一個2進整數的所有比特全部翻轉然後加上「1」。

例如:10進數「1」對應的8位有符號整數就是0000 0001而「-1」就是全部翻轉後的1111 1110再加「1」得到1111 1111。這兩個數相加得到「1 0000 0000」。因為是8位數,第九位被吃掉,於是得到「0」。

再舉例:計算10進數「15-10」

首先,10的2進是0000 1010,-10就是

翻轉後的1111 0101加1,1111 0110。

於是計算:

0000 1111(15)+1111 0110(-10)

得到「1 0000 0101」,去掉第9位得到「0000 0101」也就是「5」。

(文章最後我提供了一個方便的轉換補數的工具「比特轉換器」)

再舉例:計算「15-16」

0000 1111 + 1111 0000 = 1111 1111

「1111 1111」因為最上位是1,是負數,於是翻轉後加1得到「0000 0001」,為「-1」。

乘除法:乘除法不僅需要加法和位移(關於實現位移的電路,請百度:桶式位移器),還需要寄存器記錄下計算過程中的結果。一般情況下不會以純電路來實現,而是結合電路和彙編代碼來實現。當然,對於流行的單片機,例如51系列,atmega(arduino的cpu)系列,它們都有一系列的指令集來簡化代碼的複雜程度。可以說就是把這些個彙編演算法寫成語法糖方便嵌入式程序猿使用。

乘法:

對於10進數來說,將有效數字向左右位移能造成擴大/縮小10倍的效果。

10右移一位得到1,縮小10倍;左移一位得到100,擴大10倍。

同理,對於2進數來說,左右移能夠擴大/縮小2倍。

0000 1010(10)右移一位得到0000 0101(5);左移一位得到0001 0100(16進數「14」,16+4=20)。

單靠位移只能變化偶數倍,結合加法便能變化奇數倍。

計算「10*5」(包含彙編演算法,寫的不好,還請大家包涵)

首先,寄存器中寄存初始的乘數10和5。

我們記做寄存器A和寄存器B。然後比較2個值的大小,發現A的值不小於B。

這時將寄存器A的值複製到寄存器C中,於是寄存器A和C的值都是0000 1010 。

因為寄存器B的值為0000 0101,大於0000 0010(2)。於是便將寄存器C的值向

左移一位後得到0001 0100(20),同時寄存器B減去0000 0010(2)得到0000 0011(3),依舊大於0000 0010(2)。

於是繼續左移寄存器C的值一位,得到0010 1000(2*16+8=40),同時寄存器B繼續減0000 0010(2)得到0000 0001(1),小於2大於0。

這時將寄存器C的值加上寄存器A的值得到0011 0010(3*16+2=50),同時寄存器B減去1得到0,演算法結束,輸出寄存器C的值0011 0010(50)作為結果。

除法和求余:

除法和求余比較複雜,而且是成對出現的。

例如「10/3」(這個彙編演算法有待優化)

將被除數賦值給寄存器A,除數賦值給寄存器B、C,同時將寄存器D清零。

此時寄存器狀態為

A:0000 1010(10)

B:0000 0011(3)

C:0000 0011(3)

D:0000 0000(0)

此時C的值不大於A,D的值增加1為0000 0001,將C加上B得到0000 0110(6),不大於A,將此值賦與C,

此時寄存器狀態為

A:0000 1010(10)

B:0000 0011(3)

C:0000 0110(6)

D:0000 0001(1)

此時C不大於A,D的值增加1,為0000 0010(2)。繼續將B和C相加得到0000 1001(9),不大於A,將值賦給C。

此時寄存器狀態為

A:0000 1010(10)

B:0000 0011(3)

C:0000 1001(9)

D:0000 0010(2)

此時C不大於A,D的值增加1,為0000 0011(3)。繼續將B和C相加得到0000 1100(12),大於A,捨棄。輸出D的值「3」作為商輸出。同時將A(10)的值減去C(9)的值得到0000 0001(1)作為餘數輸出。

PS:順便夾帶點私貨:比特轉換器

專門為理解計算機的整數運算而設計的安卓app

https://play.google.com/store/apps/details?id=com.mycompany.posiconvhl=cn

【小數的運算】

小數運算利用的是浮點小數運算單元進行計算的,和整數運演算法則完全不同。

(今天太累了,以後再寫……)


不用看課本,課本都貪全,看下來常常都是知其然不知其所以然。看這本 CODE: the hidden language of computer hardware and software.

推薦點在於:這本書從第一頁開始就從問題出發(你跟隔壁好基友怎麼在晚上用手電筒來交流),帶領你從最底層的電子中子質子的運作一直到如何構造出一個計算機。讀的整個過程都是在撿你這幾年散落的知識點的過程。


5分鐘教會你古中國人古埃及人和計算機如何用二進位做乘除法 。 有空整理

找的「

1.乘法

由於計算機中,所有數值都是用2的N次方來表示的:2^n0+2^n1+2^n2+2^n3+2^n4.....

因此x*y,(x)*(2^n0+2^n1+2^n2+2^n3+2^n4)=(x*2^n0)+(x*2^n1)+(x*2^n2)+(x*2^n3)+(x*2^n4)+......即(x左移n0)+(x左移n1)+(x左移n2)+(x左移n3)+(x左移n4)+......

用15(x)*13(y)來舉例,15*13 為1111*1101

a.首先y的最低位為1(2^0),x左移0位得到1111

b.然後y的最低第二位為0,沒有2^1存在,因此本次無運算(結果可以看作為0)

c.然後y的最低第三位為1(2^2),x左移2位得到111100

d.然後y的最低第四位為1(2^3),x左移3位得到1111000

e.把a、b、c、d的結果相加1111+0+111100+1111000=11000011(195),該結果就是乘法的結果

特別的,x*y中,如果y是2的N次方,因此相當於x右移N位。

2.除法(加減交替法)

x/y其實就是,x不斷減y的過程。小學時候學的長長除法就是這個原理。

用二進位的除法x/y,比十進位容易寫,商不是0即是1,而且如果除數大於除數的1倍,商就是標記在另一個位上面了

二進位除法x/y=0.1001/0.1011手工計算如下

0.11

_______

0.1001/0.1001

10010(後面補0)

-1011

------

111(餘數)

1110(後面補0)

-1011

--------

1(餘數)

設ri表示第i次運算後所得的餘數,則:

若ri&>0,則商1,餘數和商左移1位,再減去除數,即ri+1=2ri-y

若ri&<0,則商0,餘數和商左移1位,再加上除數,即ri+1=2ri+y

用85/6來舉例,85/6=1010101/110

a.101(0101)左移1位到第3位都小於110,因此商=000

b.1010(101)左移四位是1010,比110大,商=0001,餘數=1010-110=100(101)

c.餘數100(101)左移一位是1001,比110大,商=00011,餘數=1001-110=11(01)

d.餘數11(01)左移一位是110,等於110,商=000111,餘數=0(1)

e.餘數0(1)左移一位是01,小於110,商=0001110,餘數=01

因此85/6=1010101/110=0001110,即14,餘數為最後的餘數1


The Elements of Computing Systems / Nisan Schocken

看完這個,你可以自己擼個計算機了。


計算機組成原理。


大學課本去翻一下啊。數字邏輯/模擬電路


1+0=1,1+1=0,0+0=0,異或操作。

當然還有進位,1+0=0,1+1=1,0+0=,與操作。乘法可以用移位跟加法,最簡單的x*2等於左移一位,x*y,可以把其中一個拆成2的n次方的加法,如19=16+2+1,x*19=16x+2x+x,最終變成移位跟加法,移位本身也可以用加法實現,左移就是x+x。減法是可以變成加法的,如減1=加(-1),負數只是最高位是1而已。

除法稍微複雜點,x/y,y&>2的n-1次方,且小於2的n次方,比如,3,n=2,19,n=5。拿19來說,19&>16,19x/19=z,x/32=m,m很好算,移位即可,z=m+(x-19m)/19。

比如65/19=(65/32)+(65-19*(65/32))/19=2+(65-38)/19=2+27/19

這樣只要計算27/19即可。

27除以19,就可以換減法了,即=2+(27-19)/19+1=3+8/19=3,餘數8。


《數字電路》教你一切


乘法:只說原碼的情況,首先有一個結果寄存器,初始為0,一個被乘數寄存器,一個乘數寄存器,從乘數的最低位開始,如果是0,被乘數向右移位(就是尾部添0)的結果再次存入被乘數寄存器,如果是1,被乘數向右移位的結果存入被乘數寄存器,然後被乘數與結果寄存器的內容相加再次存入結果寄存器。

補碼的移位略有不同,向右移位好像是是添1。

除法:對不起我真不知道…


通過位運算,自己查一下,這是計算機入門課程里講的


大學計算機基礎課——計算機組成原理上寫得一清二楚,若不是計算機專業的,看看CSAPP吧


推薦閱讀:

決定論可以被證偽嗎?
計算機碩士期間,如何更好地成長和「變得優秀」?
極端反人類的編程語言會有哪些特徵?
電腦重新啟動是怎麼實現的?
醫學生該如何學習編程?

TAG:計算機 |