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

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

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

series-number-one-two
 


 

簡介

十進制 (Decimal)

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

六十進制 (Sexagesimal)

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

二進制 (Binary)

在計算機 (電腦) 硬體中,指令是以一連串『』與『』的電子訊號來保持,
當電壓足夠,就呈現『ON』; 電壓不足,則呈現『OFF』,其亦能以數字表示之。
light-switch
 
二進位是以 2 為基底的數字系統。數位電路會用兩個可區分的電壓範圍表示 0 與 1;哪個範圍叫高或低、是否採正邏輯,都取決於電路與介面規格。0、1 不等於負/正電荷,也不天然等於關/開。
 

在數位系統裡,位元 (bit, binary digit) 是可表示 0 或 1 的基本資訊單位;資料會以一串位元依指定格式表示與保存。

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

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

不幸的是,二進制 (Binary) 極度不易閱讀
為了利於使用、溝通,需找到更適當的進位制。
binary-1892330_1280
 
二、八、十六都是 2 的冪次基底:一個八進位數字剛好對應 3 個 bit,一個十六進位數字剛好對應 4 個 bit。這種分組關係讓它們比十進位更方便閱讀位元資料;hex 在除錯、位址與位元旗標中尤其常見。
 
例如:

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

 
 

八進制 (Octal)

八進制 (Oct)base 8
不如 十六進制 (Hex) 使用的頻繁,
但在許多領域及場合仍會出現,
由以下數字表示,逢八進位:
Octal
(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])
值得注意的是,其由以下數字及字母表示,逢十六進位:
Hex
(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 則為階層式樣式表。
可藉下圖心領神會 😂
html-vs-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 的 #E91E63 是以十六進位寫出的色彩分量表示法;
URL 的 %20 則是 percent-encoding,以十六進位表示一個 byte。兩者都借用十六進位,但不是一般數值的進制前綴。
 


 

總結

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

十進制二進制八進制十六進制
 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

 
 

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

在〈進制簡介 (二進制、八進制、十進制、十六進制)〉中有 2 則留言

發表迴響