【x86汇编学习】十六进制计数法
说明
x86系列文章为书籍《x86汇编语言:从实模式到保护模式》的学习笔记,内容属于笔者学习总结性质。
笔者将之发表到博客上,一方面是作为笔记存档,另一方面希望对同在阅读本书的小伙伴起到理解帮助作用。
进制概念
- 基数:计数法用来表示的数字符号的个数。例如,二进制可用来表示的数字符号有0和1,基数就是
2
。 - 权:每个数字在不同的位置上(个位、十位、百位……)具有不同的基数放大倍数。用公式表示为$基数^{n-1}$(n表示从右数第几位),就是权。
- 1B、10D、13H:B(
Binary
)表示二进制、D(Decimal
)表示十进制、H(Hexadecimal
)表示十六进制。
十进制和其他进制换算规则
10D转换为1010B
$$ \frac{10}{2}=5 \cdots\cdots 0 $$ $$ \frac{5}{2}=2 \cdots\cdots 1 $$ $$ \frac{2}{2}=1 \cdots\cdots 0 $$ $$ \frac{1}{2}=0 \cdots\cdots 1 $$
将被除数除去对应进制的基数(上例为2),存余再取商继续除去基数,反复直到商为0。将余数从下到上的顺序取回表示成从左到右的数字,就完成了十进制到其他进制的转换。
1010B转换为10D
$$ 1\times2^3+0\times2^2+1\times2^1+0\times2^0=10 $$
将每个位置上的数乘对应进制的权,求和结果就是其他进制到10进制转换。
十六进制的换算同理:
30H→48D
$$ 3\times16^1+0\times16^0=48 $$
48D→30H $$ \frac{48}{16}=3 \cdots\cdots 0 $$ $$ \frac{3}{16}=0 \cdots\cdots 3 $$
实际上这个规则也适用于十进制本身:
12345D→12345D
$$ 1\times10^4+2\times10^3+3\times10^2+4\times10^1+5\times10^0=12345 $$
十六进制的必要性
仔细观察三种进制之间的换算关系:
二进制 | 十进制 | 十六进制 |
---|---|---|
0000 | 0 | 0 |
0001 | 1 | 1 |
0010 | 2 | 2 |
0011 | 3 | 3 |
0100 | 4 | 4 |
0101 | 5 | 5 |
0110 | 6 | 6 |
0111 | 7 | 7 |
1000 | 8 | 8 |
1001 | 9 | 9 |
1010 | 10 | A |
1011 | 11 | B |
1100 | 12 | C |
1101 | 13 | D |
1110 | 14 | E |
1111 | 15 | F |
得出结论:
每四位二进制可以和任何一位十六进制互相转换。
而根据这个对应关系表,人类可以将一长串二进制按从右往左每四位为一组迅速转换为十六进制,反之亦然。
1A3BC4H
分割为1|A|3|B|C|4,即可换算24位二进制:
0001 1010 0011 1011 1100 0100
使用十六进制既可以保留二进制的直观性,写起来又简短。