注:本文为 “进制与常见单位应用” 相关文章合辑。
原文为繁体,注意术语描述差异。
略作重排。
进制简介(二进制、八进制、十进制、十六进制)
发表于 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