計算機組織/概論

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

數字系統 (Numeral system)
又稱 記數系統,是用來表示『數』的方式。
 
常依以下方式分類:

  • 進位制: 十進位、二進位、八進位、十六進位…
  • 寫法: 中文數字、阿拉伯數字、羅馬數字…


 


 

簡介

十進制 (Decimal)

人類最常使用的就屬 十進制 (Decimal, Dec) 囉!
即是以 『10』 做為進位基底 (base) 的數字系統,逢十進位,
因次又稱為 base-tenbase 10

 
 

六十進制 (Sexagesimal)

六十進制 (Sexagesimal),則多用於表達時間、角度…,
如 「一小時為 60 分鐘,一分鐘為 60秒」,又稱為 base 60

 
 

二進制 (Binary)

在計算機 (電腦) 硬體中,指令是以一連串『』與『』的電子訊號來保持,
當電壓足夠,就呈現『ON』; 電壓不足,則呈現『OFF』,其亦能以數字表示之。

 
即可想像成是,以 2 為基底之數,
其中 0 (關) 表 負電荷 (negative charge),
1 (關) 表 正電荷 (positive charge)。
 

計算機的資料,是以 二進位數 (Binary Digit) 來保存,稱之 位元 (bit)
二進位的單一個 位數 (digit) 即是計算機的最基本單位。

 
二進制 (Binary),是本文的主要重點,
如出一徹,又稱為 base 2
 
讓電腦硬體直接辨識、執行,且符合指令格式 (instruction format) 的二進位指令集,
則稱為 機器語言 (machine language)
 
因此有了這個笑話😂:
神秘的電腦高手,用 0 1 0 1… 寫出作業系統
 
例:
十進制的 9487,
二進制 表示為:『 10010100001111 』,
最左邊的位數,稱為 最高有效位元 (Most Significant Bit, MSB)
最右邊的位數,稱為 最低有效位元 (Least Significant Bit, LSB)

 
 

八進制 (Octal) 與 十六進制 (Hexadecimal)

不幸的是,二進制 (Binary) 極度不易閱讀
為了利於使用、溝通,需找到更適當的進位制。

 
由於,幾乎所有計算機的資料大小,都是 4位元 的倍數
且相對於十進制,二進制 與 十六進制 (Hexadecimal, Hex) or 八進制 (Octal, Oct) 的轉換,
更加地直覺方便。因此 hex、oct 被廣泛地被運用。
 
例如:

十進制中 『 9487 』 這個數字,
二進制 需表示為: 『 10010100001111 』…,
八進制:『 22417 』,
十六進制: 『 250F 』。

 
 

八進制 (Octal)

八進制 (Oct)base 8
不如 十六進制 (Hex) 使用的頻繁,
但在許多領域及場合仍會出現,
由以下數字表示,逢八進位:

(ex: 0、1、2、3、4、5、6、7、10、11、12、13、14、15、16、17、20…)
 
 

十六進制 (Hexadecimal)

十六進制 (Hex)base 16
可說是資訊領域用的最頻繁的進制,
(例如: 記憶體傾印 memory dump、HTML or CSS 的色碼 [註1])
值得注意的是,其由以下數字及字母表示,逢十六進位:

(ex: 0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、
10、11、12、13、14、15、16、17、18、19、1A、1B、1C、1D、1E、1F、20…)
(A~F 可為大小寫)
 

務必注意!! 9 再來是 『 A 』,而非 『 10 』!!!

 
[註1]:
HTML 為用於建立網頁的標記語言,CSS 則為階層式樣式表。
可藉下圖心領神會 😂

 


 

表示法

如果每次都得這樣寫,那也太累了:

十進位的: 『 9487 』,
二進位表示為: 『 10010100001111 』,
八進位: 『 22417 』,
十六進位: 『 250F 』。

 
表示為英文,似乎也沒比較好:

Decimal: 『 9487 』,
Binary: 『 10010100001111 』,
Octal: 『 22417 』,
Hex: 『 250F 』。

 

下標

為了方便書寫,通常使用下標表示法,
也就是先前提過的 基底 (base) 概念

直接在 數字的右下角 加上目前的進制即可!

 
想更清楚的話,可先加上小括弧,再加下標。
 
ex:

948710 = (10010100001111)₂ = (22417)8 = (250F)16

 
是不是豪棒棒呢!
 
然而,這只方便書寫,在 實務開發上,仍 不利於使用
因此不同的作業系統、程式語言、應用領域..
其表示方法不盡相同,以下舉幾個例子。
 
 

首字法

故名思義,在數字後方,加上其 進制英文首字
 
八進制 (oct) ,即加上小寫『o』或 大寫『O』(ex: 22417o),
但其跟 數字 0 過於相似,因此較少使用。
 
十六進制 (hex),即加上小寫『h』或 大寫『H』(ex: 250Fh),
若該數以字母起首,會在前面增加一個 數字「0」 (ex: 0A1H = 161₁₀)。
 
 

前綴法

也就是在數字前,加上前綴字,藉此辨認進制,
常用於各種 程式語言
 
八進制 (oct),時常會以 數字『0』做為前綴,
但容易與 十進位 (dec) 產生混淆,實務上較少使用。
 
十六進位 (Hex) ,則以『0X』做為前綴。
 
譬如,常見的程式語言如 C/C++、Java、Python…,
皆使用字首「0x」,來表示十六進位 (ex: 0x7fff54b6bab8)。
 
程式範例 (Java):

public class Main {

    public static void main(String[] args) {
        int dec = 9487; // 十進制

        int binary = 0b10010100001111; // 二進制 前綴表示法 0b

        // (在 Java 7 後,可使用『底線』幫助閱讀,稱為 Underscores in Numeric Literals)
        int binary2 = 0b10_0101_0000_1111; // 二進制 前綴表示法二 0b

        int oct = 022417; // 八進制 前綴表示法 0 (不建議使用)

        int hex = 0x250F; // 十六進制 前綴表示法 0x

        System.out.println("十進制: " + dec);
        System.out.println("二進制 前綴表示法: " + binary);
        System.out.println("二進制 前綴表示法二: " + binary2);
        System.out.println("八進制 前綴表示法: " + oct);
        System.out.println("十六進制 前綴表示法: " + hex);
    }
}

/*
 * Result:
 *
 * 十進制: 9487
 * 二進制 前綴表示法: 9487
 * 二進制 前綴表示法二: 9487
 * 八進制 前綴表示法: 9487
 * 十六進制 前綴表示法: 9487
 *
 */

 
 
其他像是:
CSS 顏色的 hex色碼,會在前方加上 『#』(ex: #E91E63),
URL 中使用的 百分比編碼,會在前方加上 『%』(ex: %20 代表空格)…。
 


 

總結

進制 是每位開發者必備的基本功,本篇僅做了 進制 的粗略介紹,
尚未提及轉換、負數、運算…等,近日有閒再補上囉 😃。
 
範例原始檔
 
最後,附上一張 進制 轉換表 供參考:

十進制二進制八進制十六進制
 00000 00
 10001 11
 20010 22
 30011 33
 40100 44
 50101 55
 60110 66
 70111 77
 81000108
 91001119
10101012A
11101113B
12110014C
13110115D
14111016E
15111117F
16100002010

 
 

作者: 鄭中勝

喜愛音樂,但不知為何總在打程式 ?
期許能重新審視、整理自身所學,幫助有需要的人。

在《進制簡介 (二進制、八進制、十進制、十六進制)》中有 1 則留言

發表迴響