數字系統 (Numeral system),
又稱 記數系統,是用來表示『數』的方式。
常依以下方式分類:
- 進位制: 十進位、二進位、八進位、十六進位…
- 寫法: 中文數字、阿拉伯數字、羅馬數字…
目錄
簡介
十進制 (Decimal)
人類最常使用的就屬 十進制 (Decimal, Dec) 囉!
即是以 『10』 做為進位基底 (base) 的數字系統,逢十進位,
因次又稱為 base-ten、base 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 代表空格)…。
總結
進制 是每位開發者必備的基本功,本篇僅做了 進制 的粗略介紹,
尚未提及轉換、負數、運算…等,近日有閒再補上囉 😃。
範例原始檔
最後,附上一張 進制 轉換表 供參考:
十進制 | 二進制 | 八進制 | 十六進制 |
---|---|---|---|
0 | 0000 | 0 | 0 |
1 | 0001 | 1 | 1 |
2 | 0010 | 2 | 2 |
3 | 0011 | 3 | 3 |
4 | 0100 | 4 | 4 |
5 | 0101 | 5 | 5 |
6 | 0110 | 6 | 6 |
7 | 0111 | 7 | 7 |
8 | 1000 | 10 | 8 |
9 | 1001 | 11 | 9 |
10 | 1010 | 12 | A |
11 | 1011 | 13 | B |
12 | 1100 | 14 | C |
13 | 1101 | 15 | D |
14 | 1110 | 16 | E |
15 | 1111 | 17 | F |
16 | 10000 | 20 | 10 |
在《進制簡介 (二進制、八進制、十進制、十六進制)》中有 2 則留言