爲什麼要用到二進制?

進制及其轉換

  • 爲什麼要用到二進制?

數字電路非常廣泛,小到邏輯門電路,大到超大規模集成電路,手機,電腦,智能設備……數字信號即可以表示數字,也可以表示非數值的信息,如文字,聲音,圖片,視頻。如何將這些非數值類的信息 變成 二進制信號呢?這就涉及到編碼制度,即將信息通過編碼的方式轉成二進制值,如 MP3、MP4、midi、jpg、gif 等等

  1. 從可行性來說,採用二進制,只有 0 和 1 兩個狀態,能夠表示 0 和 1 兩種狀態的電子器件有很多,比如開關的接通和斷開、晶體管的導通和截止、磁原件的正負剩磁、電位電平的高低等都可以表示 0 和 1 兩個數。使用二進制,電子器件具有實現的可行性。

  2. 從運算的簡易性來說,二進制的運算法則少,運算簡單,使計算機運算器的硬件結構大大簡化(十進制乘法九九口訣有 55 條公式,而二進制乘法只有四條規則)。

  3. 從邏輯上講,由於二進制 0 和 1 正好和邏輯代碼假和真相對應,有邏輯代數的理論基礎,用二進制表示二值邏輯很自然。 -摘自計算機爲什麼是二進制?

  • 十進制是“十進”,採用的是“個/十/百/千/萬…”的進位遞增
  • 二進制是“二進”,採用的是“1/2/4/8/16/…”的進位遞增

基數和位權

在十進制系統中(基數 10),數4327.13表示(4×103)+(3×102)+(2×101)+(7×100)+(1×101)+(3×102)(4×10^3) + (3×10^2) + (2×10^1) + (7×10^0) + (1×10^{-1}) + (3×10^{-2}) ,其中的 10 就是我們所說的基數,基數在不同數制轉換中起着重要作用。我們用數字我們知道多位數有很多位,有十位、百位和千位,處在每個位上的單位1表示的數值大小不同,十位上的數字1代表 10 ,百位上的數字 1 代表 100,以此類推,故我們稱10n10^n爲位權 ,也稱比重 (以 10 進製爲例)

常見的進制

計算機中的任何數據都可以用一串 0 或 1 來表示,但考慮到二進制數位太長,所以我們也可以採用八進制和十六進制來表示數值數據。爲了避免出現誤會,在給出一個數的同時就必須指明這個數的數制,例如:(1010)2、(1010)8、(1010)10、(1010)16所代表的數值就不同。除了用下標來表示不同的數制以外,在計算機中還常用後綴字母來表示不同的數制。後綴 B 表示這個數是二進制數(Binary);後綴 Q 表示這個數是八進制數(Octal),本來八進制數的英文單詞的第一個字母應當是 O,因爲字符 O 與數字 0 太容易混淆,所以常使用字符 Q 作爲八進制數的後綴;後綴 H 表示這個數是十六進制數(Hexadecimal);而後綴 D 表示這個數是十進制數(Decimal)。十進制數在書寫時後綴 D 可以省略,其他進制在書寫時後綴一般不可省略。例如:有 4 個數分別爲 375D、101B、76Q、A17H,從後綴字母就可以知道它們分別是十進制數、二進制數、八進制數和十六進制數。

程序員們更喜歡採用程序設計語言的記號來表示不同進制的數,這就是前綴表示法,例如:在 C 語言中,八進制常數以前綴 0 開始,十六進制常數以前綴 0x 開始。

  • 十進制

    特點:有 10 個基數:0、1、2、3、4、5、6、7、8、9
    寫法:(D)10Decimal(D)10=i=mn1Di10i(D)_{10} —— Decimal \quad 或\quad (D)_{10}=\sum\limits_ {i=-m}^{n-1}D_i·10^i

  • 二進制

    特點:有兩個基數:0、1
    寫法:(B)2Binary(B)2=i=mn1Bi2i(B)_{2}——Binary或(B)_2=\sum\limits_{i=-m}^{n-1} B_i · 2^i

  • 八進制

    特點:有八個基數:0、1、2、3、4、5、6、7
    寫法:(O)8Octal(O)8=i=mn1=Oi8i(O)_{8}——Octal \quad 或 \quad (O)_{8}=\sum\limits_{i=-m}^{n-1}=O_i·8^i

  • 十六進制
    特點:有十六個基數:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F
    寫法:(H)16Hexadecimal(H)16=i=mn1=Hi16i(H)_{16}——Hexadecimal \quad 或 \quad (H)_{16}=\sum\limits_{i=-m}^{n-1}=H_i·16^i

不同進制數對照表

其實0~9 和 a~f都只是符號而已,如果採用 n 進制,那麼我們就用到 n 種符號來排列組合即可,當然,符號是可以重複的

進制轉化

  • 整數轉換

轉換 正整數 的進制的有一個簡單算法,就是通過用目標基數作長除法;餘數給出從最低位開始的“數字”。

a 進制轉化爲 b 進制,除 r 取餘數,直至商爲零,餘數倒序排序

例如,1020304 從 10 進制轉到 7 進制:

舉例

再如,10110111 從 2 進制到 5 進制:(注意:b 要先轉換成 a 的進制 )

舉例

  • 記憶口訣:除 b 取餘,逆序排列

  • 其他進制轉換與二進制的相互轉換

八進制和二進制

二進制轉換爲八進制,採用“3 位並 1 位”,按從右向左方向,每 3 位二進制位一組,最高位不足 3 位,添 0 補足 3 位,然後將各組 3 位二進制數加權展開,得到八進制數。

  • 小數轉換

轉換一個“十進制” 小數,可以用重複乘法,將整數部分作爲“數字”。不幸的是有限小數不一定轉換成爲有限小數,例如 0.1A4C 從 16 進制轉換到 9 進制:

舉例

  • 記憶口訣:1取整,順序排列 (1 在這裏指的是位權)

進制的簡單運算

  1. 二進制加法:1+0=1、1+1=10、11+10=101、111+111=1110

  1. 二進制減法:1-0=1、10-1=1、101-11=10、1100-111=101

  1. 八進制加法:3+4=7、5+6=13、75+42=137、2427+567=3216

  1. 八進制減法:6-4=2、52-27=23、307-141=146、7430-1451=5757

  1. 十六進制加法:6+7=D、18+BA=D2、595+792=D27、2F87+F8A=3F11

  1. 十六進制減法:D-3=A、52-2F=23、E07-141=CC6、7CA0-1CB1=5FEF

乘法和除法相對來說比較複雜,涉及到邏輯門運算,屬於計算機組成原理中的內容,先挖個坑,日後再填

  • 二進制是如何將加減乘除變換爲加法實現的?

加法是如何由邏輯運算與、或、異或來實現的?

總結

  • 十進制(D),二進制(B),八進制(O),十六進制(H)

以上內容只是說了進制轉換中如何計算的問題,是一種機械化的理解。以前見到過一篇關於進制的文章,寫的很好,可我現在找不到了,遺憾。進一步用代碼理解進制 理解進制轉換的原理

要注意的幾個地方:

  1. 在進行進制轉換時,長除法中的除數的進制和被除數的進制要保持一致
  2. 從小數點位置開始,整數部分向左,小數部分向右,每四位二進制爲一組用一位十六進制的數字來表示,不足四位的用 0 補足
  3. 十進制轉其他進制:整數部分用除基取餘法,小數部分用乘基取整法,然後將整數與小數部分拼接成一個數作爲轉換的最後結果

其他數制轉爲 十進制 ,套公式即可(b=10)。一般來講,b 進制系統中的數有如下形式:

(anan1...a1a0.c1c2c3...)b=k=0nakbk+k=1ckbk(a_{n}a_{{n-1}}...a_{1}a_{0}.c_{1}c_{2}c_{3}...)_{b}=\sum _{{k=0}}^{n}a_{k}b^{k}+\sum _{{k=1}}^{\infty }c_{k}b^{{-k}}

手指二進制

  • 看完這個我笑了 hiahiahia

拓展閱讀

二進制是計算機最適合的數據表示方法,把十進制數的各位數字變成一組對應的二進制代碼,用 4 位二進制數來表示 1 位十進制數,稱爲二進制編碼的十進制數(Binary Code Decimal),即 BCD 碼。4 位二進制數可以組合出 16 種代碼,能表示 16 種不同的狀態,只需要使用其中的 10 種狀態,就可以表示十進制數的 0~9 十個數碼,而其他的 6 種狀態爲冗餘狀態。由於可以取任意的 10 種代碼來表示 10 個數碼,所以就可能產生多種 BCD 編碼。BCD 編碼既具有二進制數的形式,又保持了十進制數的特點,可以作爲人機聯繫的一種中間表示,也可以用它直接進行運算。下圖列出了幾種常見的 BCD 碼。

  • 8421 碼

8421 碼又稱爲自然(Nature)BCD 碼,簡稱 NBCD 碼,4 位二進制代碼的位權從高到低分別爲 8、4、2、1,這種編碼的主要特點是:

  • 它是一種有權碼,設其各位的值爲 b3b2b1b0,則它所表示的十進制數爲 D=8b3+4b2+2b+1b0
  • 簡單直觀。每個代碼與它所代表的十進制數之間符合二進制數和十進制數相互轉換的規則
  • 不允許出現 1010~1111。這 6 個代碼在 8421 碼中是非法碼。

注意:儘管在 8421 碼中 0~9 十個數碼的表示形式與用二進制表示的形式一樣,但這是兩個完全不同的概念,不能混淆。例如,一個兩位的十進制數 39,它可以表示爲(00111001)421 與 100111B,這兩者是完全不同的。

  • 2421 碼

這種編碼各位的位權從高到低分別爲 2、4、2、1,其主要特點是:

  • 它也是一種有權碼,所表示的十進制數爲 D=2b3+4b2+2b1+1b0
  • 它又是一種對 9 的自補碼,即某數的 2421 碼,只要自身按位取反,就能得到該數對 9 補數的 2421 碼。例如:3 的 2421 碼是 0011,3 對 9 的補數是 6,而 6 的 2421 碼是 1100,即將 3 的 2421 碼自身按位取反可得到 6 的 2421 碼。在十進制運算中,採用自補碼,可以使運算器線路簡化。
  • 不允許出現 0101~1010。這 6 個代碼在 2421 碼中是非法碼。

對於有權碼來說,當規定各位的權不同時,可以有多種不同的編碼方案,例如還有 4221 碼、4421 碼、5421 碼和 84-2-1 碼等。

  • 餘 3 碼

餘 3 碼是一種無權碼,從表 2-7 中可以看出,餘 3 碼是在 8421 碼的基礎上加 0011 形成的,因每個數都餘 3,故稱餘 3 碼,其主要特點是:

  • 它是一種無權碼,在這種編碼中各位的“1”不表示一個固定的十進制數值,因而不直觀,且容易搞錯。

  • 它也是一種對 9 的自補碼。

  • 不允許出現 00000010,11011111。這 6 個代碼在餘 3 碼中是非法碼。

  • 格雷碼(Gray 碼)

十進制 Gray 碼的方案有很多種,表 2-7 中列出的只是其中的一種。Gray 碼可以避免在計數時發生中間錯誤,所以也被稱爲可靠性編碼。其主要特點是:

  • 它也是一種無權碼。
  • 從一種代碼變到相鄰的下一種代碼時,只有一個二進制位的狀態在發生變化。
  • 具有循環特性,即首尾兩個數的 Gray 碼也只有一個二進制位不同,因此 Gray 碼又稱爲循環碼。
  • 十進制 Gray 碼也有 6 個代碼爲非法碼,視具體方案而定。

參考文章

二進制/八進制/十進制/十六進制 怎麼學會?

wikipedia — 手指二進制

進制(二進制、十進制、八進制、十六進制)

拓展閱讀摘自教材【計算機組成原理/蔣本珊編著.一 3 版.一北京:清華大學出版社,2013.8】

版權聲明


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章