- 发布于
计数系统
- 作者
- Name
- CuB3y0nd
- GitHub
- @CuB3y0nd
学习汇编语言不免要和数字打交道。在这个过程中,我们要用到三种数制:十进制 (Decimal)、二进制 (Binary) 和十六进制 (Hexadecimal)。
二进制计数法
二进制是现代主流计算机使用的基础表示形式。在计算机内部,所有数据都以二进制形式表示,这意味着数字、文字、图像等信息都被转换为由 和 组成的二进制编码。这种简单的编码方式使得计算机能够高效地处理和存储各种类型的数据,从而实现了计算、存储、通信等各种功能。
IMPORTANT
在计算机中,二进制对应着高低电平的组合。计算机通过高、低两种电平的组合来表示数字,高电平被认为是 ,低电平被认为是 。
组成二进制数的每个数位称为一个比特 (bit),一个二进制数可以看作一个比特串。数值越大,这个比特串就越长,这也是二进制计数法不好的一面。
二进制转十进制
每种计数法都有自己的数符。十进制有 这十个数符;二进制则只有 这两个数符。这些数符的个数被称为基数。也就是说。十进制有 个基数,而二进制只有两个。
二进制和十进制都是进位记数法。进位记数法的一个特点是:数符的值和它在这个数中所处的位置有关。比如,十进制数 ,数字 在个位上,所以是「6 个」; 在十位上,所以是「50」; 在百位上,所以是「300」,即
由于所处的位置不同,每个数位都有一个不同的放大倍数,称为「权」。每个数位的权是这样计算的(这里仅讨论整数):从右往左开始,以基数为底,指数从 开始递增的幂。正如上面的公式所清楚表明的那样,「6」在最右边,所以它的权是以 为底、指数为 的幂 ;而 ,它的权则是以 为底、指数为 的幂 。
上面的公式是将 十进制 数转换成 十进制 数,好像没什么用。但是这个公式是可以推广的,可以用它来将二进制数转换成十进制数。
比如一个二进制数 ,它的基数是 ,可以这样来计算与其等值的十进制数:
十进制转二进制
为了将一个十进制数转换成二进制数,可以将它不断除以二进制的基数 ,直到商为 ,然后将每一步得到的余数串起来即可。
例如,将十进制数 转换成二进制数 ,可以这样做:
然后,从下往上,将每一步得到的余数串起来,从左往右书写,就是我们转换后的最终结果了。
TIP
至于为什么 ,那是因为 被除数=除数x商+余数
十六进制计数法
为了解决二进制计数法写起来太长,一点也不方便的问题,人们发明了十六进制计数法。
对于自然数里的前 个,十进制和十六进制的表示方法是一样的。但是, 之后的数,两者的表示方法就大相径庭了,下面是一张简单的对照表。
十进制 | 十六进制 | 十进制 | 十六进制 |
---|---|---|---|
0 | 0 | 17 | 11 |
1 | 1 | 18 | 12 |
2 | 2 | 19 | 13 |
3 | 3 | 20 | 14 |
4 | 4 | 21 | 15 |
5 | 5 | 22 | 16 |
6 | 6 | 23 | 17 |
7 | 7 | 24 | 18 |
8 | 8 | 25 | 19 |
9 | 9 | 26 | 1A |
10 | A | 27 | 1B |
11 | B | 28 | 1C |
12 | C | 29 | 1D |
13 | D | 30 | 1E |
14 | E | 31 | 1F |
15 | F | 32 | 20 |
16 | 10 | 33 | 21 |
很显然,一旦某个数字增加到 之后,下一次,他将变成 ,而不是向前进位。因为这里是逢 才进位的。进位只发生在某个数位原先是 的情况下,比如 ,它加 后就会变成 。
TIP
不要惊讶于字母居然可以作为数字。你认为字母不能作为数字只是因为你从小就习惯了这种思想,你只要把它当作一种新型语言来看待就好了。
十六进制转十进制
与二进制转十进制原理相同。即,从右往左开始,以基数为底,指数从 开始递增的幂,把每一位都如此相加起来即可。
例如要将十六进制数 转换为十进制,可以这样做:
十进制转十六进制
相应地,要将一个十进制数转换为十六进制数,可以采用不断除以基数并取其余数的策略。
例如,要将 转换为十六进制。
最后,从下往上,从左到右书写余数即可。得到 。
二进制制转十六进制
二进制转十六进制的方法有所不同:将二进制数从右往左,以 4-bit 为一组,分别将每一组的值转换为十六进制即可。
例如,将 转换为十六进制。
因为已经分好组了,所以直接将每一组数都分别转换为十六进制,得到
同理,如果看见 ,我们也可以将它快速的转换为二进制数
我们已经讨论了二进制计数法的缺点,因此,十六进制的优点已经很明显了:既保留了二进制数的直观性,同时写起来还简短。
最后,附上一张部分十进制数、二进制数和十六进制数的对照表。
十进制 | 二进制 | 十六进制 | 十进制 | 二进制 | 十六进制 |
---|---|---|---|---|---|
0 | 0000 | 0 | 10 | 1010 | A |
1 | 0001 | 1 | 11 | 1011 | B |
2 | 0010 | 2 | 12 | 1100 | C |
3 | 0011 | 3 | 13 | 1101 | D |
4 | 0100 | 4 | 14 | 1110 | E |
5 | 0101 | 5 | 15 | 1111 | F |
6 | 0110 | 6 | 16 | 0001 0000 | 10 |
7 | 0111 | 7 | 17 | 0001 0001 | 11 |
8 | 1000 | 8 | 55 | 0011 0111 | 37 |
9 | 1001 | 9 | 195 | 1100 0011 | C3 |