代码炼金工坊

【x86汇编学习】十六进制计数法

说明

x86系列文章为书籍《x86汇编语言:从实模式到保护模式》的学习笔记,内容属于笔者学习总结性质。

笔者将之发表到博客上,一方面是作为笔记存档,另一方面希望对同在阅读本书的小伙伴起到理解帮助作用。

进制概念

十进制和其他进制换算规则

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 $$

十六进制的必要性

仔细观察三种进制之间的换算关系:

二进制十进制十六进制
000000
000111
001022
001133
010044
010155
011066
011177
100088
100199
101010A
101111B
110012C
110113D
111014E
111115F

得出结论:

每四位二进制可以和任何一位十六进制互相转换。

而根据这个对应关系表,人类可以将一长串二进制按从右往左每四位为一组迅速转换为十六进制,反之亦然。

1A3BC4H

分割为1|A|3|B|C|4,即可换算24位二进制:

0001 1010 0011 1011 1100 0100

使用十六进制既可以保留二进制的直观性,写起来又简短。