注:本文為 “進制與常見單位應用” 相關文章合輯。
原文為繁體,注意術語描述差異。
略作重排。
進制簡介(二進制、八進制、十進制、十六進制)
發表于 2017-01-20 鄭中勝
數字系統(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)是本文的重點,也稱為 b a s e 2 base\ 2 base?2。
讓電腦硬件直接辨識、執行且符合指令格式(instruction format)的二進制指令集,稱為機器語言(machine language)。
例如:
- 十進制的 9487 9487 9487,
- 二進制表示為:“ 10010100001111 10010100001111 10010100001111”,
- 最左邊的位數稱為最高有效位元(Most Significant Bit, MSB),
- 最右邊的位數稱為最低有效位元(Least Significant Bit, LSB)。
八進制(Octal)與十六進制(Hexadecimal)
不幸的是,二進制(Binary)極難閱讀。為了便于使用和溝通,需要找到更合適的進位制。幾乎所有計算機的資料大小都是 4 位元的倍數,且相對于十進制,二進制與十六進制(Hexadecimal, Hex)或八進制(Octal, Oct)的轉換更加直觀方便。因此,Hex 和 Oct 被廣泛應用。
例如:
- 十進制中的“ 9487 9487 9487”這個數字,
- 二進制需表示為:“ 10010100001111 10010100001111 10010100001111”,
- 八進制為:“ 22417 22417 22417”,
- 十六進制為:“ 250 F 250F 250F”。
八進制(Octal)
八進制(Oct), b a s e 8 base\ 8 base?8,不如十六進制(Hex)使用頻繁,但在許多領域及場合仍會出現,由以下數字表示,逢八進制:
(ex: 0、1、2、3、4、5、6、7、10、11、12、13、14、15、16、17、20…)
十六進制(Hexadecimal)
十六進制(Hex), b a s e 16 base\ 16 base?16,是資訊領域用得最頻繁的進制之一(例如:內存傾印 memory dump、HTML 或 CSS 的色碼)。值得注意的是,其由以下數字及字母表示,逢十六進制:
(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”!
: HTML 為用于建立網頁的標記語言,CSS 則為階層式樣式表。
表示法
如果每次都這樣寫,未免過于繁瑣:
- 十進制的:“ 9487 9487 9487”,
- 二進制表示為:“ 10010100001111 10010100001111 10010100001111”,
- 八進制:“ 22417 22417 22417”,
- 十六進制:“ 250 F 250F 250F”。
用英文表示似乎也并無改善:
- Decimal:“ 9487 9487 9487”,
- Binary:“ 10010100001111 10010100001111 10010100001111”,
- Octal:“ 22417 22417 22417”,
- Hex:“ 250 F 250F 250F”。
下標法
為了方便書寫,通常使用下標表示法,即在數字的右下角加上當前的進制。為更清晰,可先加上小括弧,再加下標。
例如:
948 7 10 = ( 10010100001111 ) 2 = ( 22417 ) 8 = ( 250 F ) 16 9487_{10} = (10010100001111)_2 = (22417)_8 = (250F)_{16} 948710?=(10010100001111)2?=(22417)8?=(250F)16?
這種方法雖然方便書寫,但在實際開發中仍不便于使用。因此,不同的操作系統、編程語言、應用領域等,其表示方法不盡相同,以下舉幾個例子。
首字法
顧名思義,在數字后方加上其進制的英文首字。
- 八進制(oct):即加上小寫“o”或大寫“O”(ex: 22417 o 22417o 22417o),但其與數字 0 過于相似,因此較少使用。
- 十六進制(hex):即加上小寫“h”或大寫“H”(ex: 250 F h 250Fh 250Fh)。
前綴法
在數字前加上前綴字,借此辨認進制,常用于各種編程語言。
- 八進制(oct):時常會以數字“0”作為前綴,但容易與十進制(dec)產生混淆,實際使用較少。
- 十六進制(Hex):則以“0X”作為前綴。
例如,常見的編程語言如 C/C++、Java、Python 等,皆使用字首“0x”來表示十六進制(ex: 0 x 7 f f f 54 b 6 b a b 8 0x7fff54b6bab8 0x7fff54b6bab8)。
編程示例(Java):
public class Main {public static void main(String[] args) {int dec = 9487; // 十進制int binary = 0b10010100001111; // 二進制 前綴表示法 0bint binary2 = 0b10_0101_0000_1111; // 二進制 前綴表示法二 0b(Java 7 后可使用“底線”幫助閱讀,稱為 Underscores in Numeric Literals)int oct = 022417; // 八進制 前綴表示法 0(不建議使用)int hex = 0x250F; // 十六進制 前綴表示法 0xSystem.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 |
電腦常見單位:bit、bps、byte、octet、word、KB、KiB…
發表于 2017-01-30 鄭中勝
位元(Bit)
計算機的資料以二進制數(Binary Digit)保存,稱為位元(bit)。一個位元(bit)可以包含“0”“1”這兩個數值,是計算機的最基本資料單位。
位元/秒(bps)
位元/秒(bps)意指 bit per second,位元速率經常在電信領域用作連線速度、傳輸速度(例如網速、USB)。
- 1 Kbps = 1 0 3 10^3 103 bit/s = 每秒傳輸 1,000 bit
- 1 Mbps = 1 0 6 10^6 106 bit/s = 每秒傳輸 1,000,000 bit
- 1 Gbps = 1 0 9 10^9 109 bit/s = 每秒傳輸 1,000,000,000 bit
字節(Byte)
字節(byte),又稱字節,為 8 = 2 3 8 = 2^3 8=23 個位元,是大部分計算機架構(architecture)中的定址單位(Byte addressing)。因此,有些計算機沒有搬移一個“位元”的指令,但至少有搬移一個字節的指令。
Octet
Octet 為 8 = 2 3 8 = 2^3 8=23 個位元。雖然與字節(byte)相同,但 byte 過去作為儲存大小單位,被廣泛地使用于計算機領域,卻無一致的定義。因此,現今許多計算機架構、網絡協定(如 RFC5234)中,都會使用 Octet 來精準地表示 8 位元,避免造成誤解。
字組(Word)
字組(word),又稱字元組(注意:不同于字節 byte),并無規范大小。它是計算機架構中設計處理器(CPU)時處理資料的自然單位,是影響計算機設計的重要因素。一個字組(word)由一或多個位元組(byte)組成,其位元(bit)數量稱為字組大小(word size)或字寬(word width)、字長(word length),字組大小通常對應于暫存器(register)寬度,常見的有 32 32 32、 64 64 64 位元。
字(計算機) - 維基百科,自由的百科全書
KB、KiB、MB、MiB…
盡管許多計算機理論建立在二進制的基礎上,許多通訊協定、儲存系統等使用十進制作為計量單位(例如:你買了 8G 隨身碟,以為是 8 × 1024 8 \times 1024 8×1024 MB,卻發現比想象中的小很多)。
為避免混淆,國際單位制(SI)與國際電工委員會(IEC)分別制定了十進制與二進制的規范:
-
十進制:
- KB(Kilobyte)= 1000 1000 1000 byte = 1 0 3 10^3 103 byte = 千字節
- MB(Megabyte)= 1000 1000 1000 KB = 1 0 6 10^6 106 byte = 百萬字節
- GB(Gigabyte)= 1000 1000 1000 MB = 1 0 9 10^9 109 byte = 十億字節
- TB(Terabyte)= 1000 1000 1000 GB = 1 0 12 10^{12} 1012 byte = 兆字節
- PB(Petabyte)= 1000 1000 1000 TB = 1 0 15 10^{15} 1015 byte = 千兆字節
- EB(Exabyte)= 1000 1000 1000 PB = 1 0 18 10^{18} 1018 byte = 艾(艾可薩)字節
-
二進制:
- KiB(kibibyte)= 1024 1024 1024 byte = 2 10 2^{10} 210 byte
- MiB(Mebibyte)= 1024 1024 1024 KB = 2 20 2^{20} 220 byte
- GiB(Gibibyte)= 1024 1024 1024 MB = 2 30 2^{30} 230 byte
- TiB(Tebibyte)= 1024 1024 1024 GB = 2 40 2^{40} 240 byte
- PiB(Pebibyte)= 1024 1024 1024 TB = 2 50 2^{50} 250 byte
- EiB(Exbibyte)= 1024 1024 1024 PB = 2 60 2^{60} 260 byte
然而,長久以來的習慣是:
大家仍時常使用 MB、GB 等,代稱 MiB、GiB。
位元速率
常用于傳輸速率的“位元/秒(bit per second, bps)”,用法依此延伸:
- KB/s = kilobyte per second = 1 0 3 10^3 103 byte/s
- KiB/s = kibibyte per second = 2 10 2^{10} 210 byte/s
因此:
- 10 Mbps = 10 × 1 0 6 10 \times 10^6 10×106 bps = 1.25 MB/s = 1.1920929 MiB/s
- 100 Mbps = 100 × 1 0 6 100 \times 10^6 100×106 bps = 12.5 MB/s = 11.920929 MiB/s
via:
-
進制簡介 (二進制、八進制、十進制、十六進制) - 發表於 2017-01-20 鄭 中勝
https://notfalse.net/14/numeral-system-intro -
電腦常見單位: bit、bps、byte、octet、word、KB、KiB… - 發表於 2017-01-30 鄭 中勝
https://notfalse.net/16/basic-unit