跳转至内容

数据表示基础:进制

来自Wikibooks,开放世界的开放书籍

试卷 2 - ⇑ 数据表示基础 ⇑

← 数制 进制 比特和字节 →



来自规范:数据表示基础 - 进制

熟悉进制的概念,特别是

  • 十进制(基数 10)
  • 二进制(基数 2)
  • 十六进制(基数 16)。


在十进制、二进制和十六进制之间进行转换。

在我们深入数制的世界之前,我们需要一个参考点,我建议您复制下表,以便在本章中随时参考以检查您的答案。

十六进制 二进制 十进制
0 0000 0
1 0001 1
2 0010 2
3 0011 3
4 0100 4
5 0101 5
6 0110 6
7 0111 7
8 1000 8
9 1001 9
A 1010 10
B 1011 11
C 1100 12
D 1101 13
E 1110 14
F 1111 15
10 0001 0000 16

十进制

[编辑 | 编辑源代码]

十进制是您可能从小就使用的数制。它也是基数 10 的另一种说法。这意味着每个数字可以使用 10 个不同的数字,即

0,1,2,3,4,5,6,7,8,9

请注意,如果我们想说“十”,我们会使用上面数字中的两个数字 1 和 0。

千位 百位 十位 个位
103 102 101 100
1000 100 10 1
5 9 7 3

使用上表,我们可以看到每一列都有一个不同的值分配给它。如果我们知道列值,我们就可以知道数字,这在我们开始查看其他进制系统时将非常有用。显然,上面的数字是:五千、九百、七十和三个单位。

5*1000 + 9*100 + 7*10 + 3*1 = 597310

二进制

[编辑 | 编辑源代码]

二进制是一个基数为 2 的数制,这意味着每个数字可以使用两个数字

0, 1

使用这两个数字,我们应该能够写出(或近似)所有可以用十进制写出的数字。

一百二十八位 六十四位 三十二位 十六位 八位 四位 两位 个位
27 26 25 24 23 22 21 20
128 64 32 16 8 4 2 1
0 1 1 0 1 0 1 0

使用上表,我们可以看到每一列都有一个分配给它的值,该值是 2 的幂(基数!),如果我们取这些值和相应的数字,我们可以计算出数字的值:1*64 + 1*32 + 1*8 + 1*2 = 106。

如果要求您计算二进制数字的值,最好的起点是用其对应值标记每一列,并将所有包含 1 的列加起来。让我们看另一个例子

000111112
128 64 32 16 8 4 2 1
0 0 0 1 1 1 1 1

因此,现在我们需要做的就是将包含 1 的列加起来:1*16 + 1*8 + 1*4 + 1*2 + 1*1 = 31

练习:二进制

将以下二进制数转换为十进制

000011002

答案

128 64 32 16 8 4 2 1
0 0 0 0 1 1 0 0
8+4 = 1210

010110012

答案

128 64 32 16 8 4 2 1
0 1 0 1 1 0 0 1
64 + 16 + 8 + 1 = 8910

000001112

答案

128 64 32 16 8 4 2 1
0 0 0 0 0 1 1 1
4 + 2 + 1 = 710

010101012

答案

128 64 32 16 8 4 2 1
0 1 0 1 0 1 0 1
64 + 16 + 4 + 1 = 8510

我们如何判断一个二进制数是否为奇数?

答案

其最右边的数字为 1

是否有一种快捷方式来计算由连续 1 组成的二进制数,例如:011111112

答案

是的,取第一个 0 的列值减 1

128 64 32 16 8 4 2 1
0 1 1 1 1 1 1 1
= 128 - 1 = 127 = 64 + 32 + 16 + 8 + 4 + 2 + 1
000011112 = 16 - 1 = 15 = 8 + 4 + 2 + 1
000001112 = 8 - 1 = 7 = 4 + 2 + 1

如果我们要使用八进制(一个基数为 8 的数制),列出每个数字可以取的不同数字

答案


0, 1, 2, 3, 4, 5, 6, 7

十六进制

[编辑 | 编辑源代码]
来自规范:数据表示基础 - 进制

熟悉并能够使用十六进制作为二进制的简写,理解它为什么以这种方式使用。

您可能会从表中注意到,一个十六进制数字可以精确地表示 4 个二进制位。十六进制对我们来说是一种书写二进制的简写方式,并且可以更轻松地处理长二进制数字。

计数是一个基本概念,使用符号来表示一组对象。我们习惯于使用 10 个这样的符号(0-9)进行计数。当我们用完符号时,我们开始一列新的数字来表示更大的值集合。还有其他使用不同数量符号的计数方法,但是,计数过程以相同的方式进行。

十六进制是一个基数为 16 的数制,这意味着我们将有 16 个不同的数字来表示我们的数字。唯一的问题是我们在 9 之后用完了数字,并且知道 10 被计为两位数,我们需要使用字母来代替

0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F

我们可以对十进制和二进制执行完全相同的事情,并写出我们的表格。

165 164 163 162 161 160
1 048 576 65536 4096 256 16 1
0 0 3 4 A F

因此,现在我们需要做的就是将包含值的列加起来,但请记住 A = 10,B = 11,C = 12,D = 13,E = 14,F = 15。

3*4096 + 4*256 + (A)10*16 + (F)15*1 = 1348716

您可能想知道,当我们有二进制和十进制时,以及当计算机以二进制方式存储和计算所有内容时,为什么我们要使用十六进制。答案是它完全是为了人类的方便。考虑以下示例

表示 基数
EFFE1116 基数 16 十六进制
1572814510 基数 10 十进制
1110111111111110000100012 基数 2 二进制

所有数字都是相同的,最容易让人记住/理解的版本是基数 16。十六进制用于计算机中表示供人类使用的数字,用于内存地址、错误或颜色代码等内容。注意:十六进制之所以使用,是因为它是二进制的简写,并且更容易让人记住。它不会占用计算机内存中的更少空间,只在纸上或在你的脑海中!计算机仍然必须将所有内容存储为二进制,即使它在屏幕上显示为十六进制。

A colour palette showing each colour can be shown as a hexadecimal code
一个显示每种颜色的调色板可以用十六进制代码表示
Error messages are written using hex to make it easier for us to remember and record them
错误消息使用十六进制编写,以便我们更容易记住和记录它们
练习:十六进制

将以下十六进制数转换为十进制
A116

答案

16  1
 A  1

16 * 10 + 1 * 1 = 16110

FF16

答案

16  1
 F  F

16 * 15 + 1 * 15 = 25510

0D16

答案

16  1
 0  D

16 * 0 + 1 * 13 = 1310

3716

答案

16  1
 3  7

16 * 3 + 1 * 7 = 5510

我们为什么要使用十六进制系统?

答案

十六进制用于人类,因为它更短,更容易理解和阅读。

列举十六进制系统的一个用途

答案

十六进制用于错误消息代码、内存地址和颜色代码

进制转换

[编辑 | 编辑源代码]

您之前看到的从十六进制转换为十进制的求和看起来有点麻烦,并且在考试中您不希望出现任何错误,因此我们必须找到一种更简单的方法来进行转换。

由于 4 个二进制位由一个十六进制数字表示,因此在两者之间进行转换非常简单。您可以将二进制位分组为 4 位一组,从右开始,并在需要时在左侧添加额外的 0,然后将每个组转换为其十六进制等效项。例如,二进制数 01101100111101012 可以这样写

0110 1100 1111 0101

然后通过使用上表,您可以将每组 4 位转换为十六进制

0110 1100 1111 0101
  6    C    F    5

因此,二进制数 01101100111101012 在十六进制中为 6CF516。我们可以通过将两者都转换为十进制来检查这一点。首先我们将转换二进制数,因为您已经知道如何执行此操作

32768 16384 8192 4096 2048 1024 512 256 128 64 32 16 8 4 2 1
0 1 1 0 1 1 0 0 1 1 1 1 0 1 0 1

通过将列相乘然后将结果相加,答案为 2789310

注意列标题都是2的幂,,等等。要将十六进制转换为十进制,我们必须使用以16为底的幂作为列标题,如下所示。

4096 256 16 1
6 C F 5

(你应该记住A-F的值)

将它们全部加起来,我们得到2789310,这表明01101100111101012等于6CF516

要将十进制转换为十六进制,建议先将数字转换为二进制,然后使用上述简单方法将二进制转换为十六进制。

总之,要将一个数字转换为另一个数字,我们可以使用以下规则:十六进制 <-> 二进制 <-> 十进制

练习:十六进制和进制转换

将以下十六进制值转换为十进制

1216

答案

  1    2  (Hex)
0001 0010 (Binary)

128 64 32 16  8  4  2  1
  0  0  0  1  0  0  1  0 = 16+2 = 1810 (decimal)

A516

答案

  A    5  (Hex)
1010 0101 (Binary)

128 64 32 16  8  4  2  1
  1  0  1  0  0  1  0  1  = 128+32+4+1 = 16510 (decimal)

7F16

答案

  7    F  (Hex)
0111 1111 (Binary)

128 64 32 16  8  4  2  1
  0  1  1  1  1  1  1  1  = 64+32+8+4+2+1 = 12710 (decimal)

1016

答案

  1    0  (Hex)
0001 0000 (Binary)

128 64 32 16  8  4  2  1
  0  0  0  1  0  0  0  0  = 1610 (decimal)

将以下二进制数转换为十六进制

101011012

答案

1010 1101 (Binary)
  A    D  (Hex)

1101112

答案

0011 0111 (Binary)
  3    7  (Hex)

101011112

答案

1010 1111 (Binary)
  A    F  (Hex)

1110101000012

答案

1110 1010 0001 (Binary)
  E    A    1  (Hex)

将以下十进制数转换为十六进制

8710

答案

128 64 32 16  8  4  2  1
  0  1  0  1  0  1  1  1  = 64+16+4+2+1 = 8710 (decimal)
0101 0111 (Binary)
  5    7  (Hex)

1210

答案

128 64 32 16  8  4  2  1
  0  0  0  0  1  1  0  0  = 8+4 = 12(decimal)
0000 1100 (Binary)
  0    C  (Hex)

11710

答案

128 64 32 16  8  4  2  1
  0  1  1  1  0  1  0  1  = 64+32+16+4+1 = 117(decimal)
0111 0101 (Binary)
  7    5  (Hex)

为什么可能使用十六进制?

答案

以便使错误消息和内存地址等内容更容易让人类理解、阅读和记忆——因为它们更短。

给出十六进制的两种用途?

答案


  • 错误消息代码
  • 内存地址位置
  • 颜色代码
华夏公益教科书