IB/第 4 组/计算机科学/计算机组织/信息层
数字使用 位置表示法 写成。最右边的数字表示其值乘以基数的零次方。左边的下一个数字表示其值乘以基数的一次方。下一个数字表示其值乘以基数的二次方。下一个数字表示其值乘以基数的三次方,等等。即使不知道,人们通常也熟悉位置表示法。人们本能地倾向于使用这种方法来计算 943 中 1 的个数
定义定位记数法的一种更正式的方法是说,数值被表示为一个以数制基数为底的多项式。但什么是多项式?多项式是由两个或多个代数项的和构成,每个代数项由一个常数乘以一个或多个变量的非负整数幂组成。在定义定位记数法时,变量就是数制的基数。因此,943 可以表示为一个多项式,如下所示,其中 代表基数。
为了正式表达这个概念,一个以 为底的数制中的数字有 位数字,表示如下,其中 表示数字中第 位上的数字。
看起来很复杂吗?让我们以以 10 为底的 63578 为例。在这里, 是 5(这个数字恰好有 5 位数字),而 是 10(基数)。这个公式说明,第五位数字(最左边的数字)乘以基数的四次幂;第四位数字乘以基数的三次幂,以此类推。
在之前的计算中,我们假设基数为 10。这是一个合乎逻辑的假设,因为通用数制 *就是* 十进制。然而,943 没有理由不能表示以 13 为底的值。为了区分这些值,我们使用 的通用符号来表示以 为底的数字 。因此, 是十进制系统中的一个数字。为了将 转换为 ,我们只需使用之前的计算方法即可。
因此,13 进制中的 943 等于 10 进制中的 1576,或者 。必须记住,这两个数字的值是等价的。也就是说,它们都代表着相同数量的“事物”。如果一个袋子里装了 颗豆子,另一个袋子里装了 颗豆子,那么这两个袋子里装的豆子数量完全相同。只是不同的数制允许人们用不同的方式来表示这个值。
请注意,在十进制中,最右边的数字是“个位”。在十三进制中,最右边的数字也是“个位”。事实上,任何进制都是如此,因为任何数的零次方都等于 1。
为什么有人会想要用十三进制表示数值?诚然,这并不常见,但了解其工作原理有时会有所帮助。例如,一种叫做哈希的计算技术会对数字进行混淆,而混淆数字的一种方法就是用不同的进制来解释它们。
其他的进制,比如二进制 (base 2),在计算机处理中尤为重要。熟悉 2 的幂进制,比如八进制 (base 8) 和十六进制 (base 16),也是很有帮助的。
二进制
[edit | edit source]什么是二进制 ?
[edit | edit source]二进制这个词指的是任何只有两种可能值的编码。在计算机科学中,它们指的是电子值 0 和 1(见下图)。布尔值是二进制的。在计算机中,我们使用二进制而不是十进制系统,因为与十进制系统相比,二进制系统在电子设备中进行计算的方式更简单、更高效。这可以通过以下关于二进制门的章节进行探讨。
计算机将电压解释为二进制。鉴于我们身处最大电压为 5 伏特的系统中,如果电线中的输入电流电压在 0 伏特到 0.8 伏特之间,则晶体管会将输入电流解释为逻辑 0。另一方面,如果电压在 2 伏特到 5 伏特之间,则晶体管将输入信号解释为逻辑 1(右图)。需要注意的是,有一个不可用的电压区域,它不对应于逻辑 0 或 1。这个不可用的区域特别有用,因为电压总是会略微波动,拥有这个灰色区域可以让我们更好地区分彼此的电信号(0 和 1)。类似地,从伏特到二进制数字的电压转换也适用于晶体管的输出信号。¹
数制中的进制指定了系统中使用的数字数量。这些数字总是从 0 开始,一直延续到比进制少 1 的数字。例如,二进制中有 2 个数字:0 和 1。八进制中有 8 个数字:0 到 7。十进制中有 10 个数字:0 到 9。进制也决定了数字位置的含义。当对数制中的最后一个数字加 1 时,需要将进位到左边的数字位置。
什么是比特 ?
[edit | edit source]一个比特是计算机可以处理和存储数据的最小单位。它可以存储 1 或 0,分别表示开/关、真/假、是/否。
什么是字节 ?
[edit | edit source]1 个字节是由 8 个比特组成的/存储的。1 个字节代表 28 个不同的值。
如何将十进制数转换为二进制数 ?
[edit | edit source]如果我们要将十进制数转换为二进制数,我们也会使用之前的转换表。
例如,让我们将十进制数 56 转换为二进制数。
- 首先,我们找出可以完全容纳在 56 中的最大的二进制幂。这是 32 = 25。不是 64,因为 56 无法完全容纳在 64 中。
- 然后,我们求 56 - 32 的余数,即 24。我们检查可以完全容纳在 24 中的最大的二进制幂。这是 16 = 24。
- 然后我们取 24 - 16 的余数,即 8。我们检查哪个最大的二进制幂可以完全放入 24 中。这是 8 = 23。
- 最后 8 - 8 = 0,所以我们已经到达了结尾。
现在我们将用于计算的二进制幂标记为二进制 1,并将其他幂标记为 0。我们得到 00111000
27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | |
= | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
= | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
---|
要将二进制数转换为十进制数,我们只需要将二进制位中所有值为 1 的 2 的幂相加。
首先,我们必须计算二进制数中的位数,并将其与 2 的幂关联起来,从 到 。
对于二进制中的每一位,我们必须将该数字乘以 2 的对应指数。例如
取二进制数 1011。按照前面的位置数规则,我们得到以下表格
现在按照相同的逻辑,只是写法不同,如果我们将以下字节转换为十进制:10011100
1 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | |
---|---|---|---|---|---|---|---|---|
= | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 |
= | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
= | 128 | 16 | 8 | 4 |
我们只添加二进制位等于 1 的列。
最后,我们将每个数字加起来,这就是从二进制转换的数字。
所以 10011100 = 128 + 16 + 8 + 4 = 156
一个字节是 8 位,这意味着在一个字节的数据中可以存储的值的数量是 28 = 256。
在一个 n 位数字中,我可以存储多少个可能的数字?
由于有 n 个可能的位,每个位可以取两个可能的值(1 或 0),因此在一个 n 位数字中,我们可以存储 个可能的数字。
在一个字节中,这意味着我们可以存储 28 = 256 个不同的数字。
在一个 n 位数字中,我可以得到的最大数字是多少?
由于有 n 个可能的位,每个位可以取两个可能的值(1 或 0),因此我们可以获得的最大数字是 2n -1。实际上,我们可以获得的最小数字是 0,因此公式中减去 1。
在一个字节中,这意味着我们可以获得的最大数字是 28 -1 = 255,即 11111111,而最小数字是 0,即 0000000。
1. 1001 的十进制表示是什么?
23 + 20 = 8 + 1 = 9
2. 01000101 的十进制表示是什么?
26 + 22+ 20 = 64 + 4 + 1 = 69
3. 42 的二进制表示是什么?
42 - 32 = 10,其中 32 = 25
10 - 8 = 2,其中 8 = 23
2 - 2 = 0,其中 2 = 21
因此,二进制表示为:00101010
4. 129 的二进制表示是什么?
129 - 128 = 1,其中 128 = 27
1 - 1 = 0,其中 1 = 20因此,二进制表示为:01000001
5. 我可以在 2 个字节中表示多少个不同的整数?
2 个字节是 16 位(2 x 8 位),因此 216 = 65536 个不同的数字可以在 2 个字节中表示
6. 我可以在 2 个字节中表示的最大数字是多少?
2 个字节是 16 位(2 x 8 位),因此 216 -1 = 65535 是可以在 2 个字节中表示的最大数字。
在高于 10 的进制中,数字是如何表示的?在高于 10 的进制中,大于整数 9 的数字将用符号表示。所有数字都写在以下转换表中。
十进制 | 十六进制 | 二进制 |
---|---|---|
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
10 | A | 1010 |
11 | B | 1011 |
12 | C | 1100 |
13 | D | 1101 |
14 | E | 1110 |
15 | F | 1111 |
十六进制是一个使用 16 个可能的数字的记数系统。它最主要的吸引力在于它能够用比二进制或十进制系统更少的数字来表示非常大的数字。
方法如下
- 对十进制数字进行以 16 为底的向下取整除法。从左侧开始写下余数。
- 继续对先前向下取整除法的结果进行以 16 为底的向下取整除法,直到得到 0。继续写下余数。
- 使用右侧的表格将余数从最后一位到第一位转换为十六进制。
- 你得到了十六进制数字!
例如,如果我们要将十进制数 2545 转换为十六进制
- 我们使用地板除法:2545 // 16 = 159,该除法的余数为 2545 % 16 = 1
- 我们对之前的结果使用地板除法:159 // 16 = 9,该除法的余数为 159 % 16 = 15
- 我们对之前的结果使用地板除法:9 // 16 = 0,该除法的余数为 9 % 16 = 9。
- 我们到达了 0,所以我们停止除法。
- 我们转换我们的余数:9 → 9,15 → F,1 → 1
- 所以我们的十六进制数为:9F1
这种转换比较简单,因为我们可以使用位值法来转换我们的数字。实际上,我们只需要将每个十六进制数字乘以它相应的 16 的幂。
例如,如果我们想将十六进制数 ABC 转换为十进制数,我们将 乘以 ,因为数字中有 12 个 1, 乘以 ,因为有 11 个十六,以及 乘以 ,因为有 10 个二百五十六。
要将二进制数转换为十六进制数,首先要确保二进制数的长度是 4 的倍数。如果不是,在数字前面添加 0,直到它是 4 的倍数。
接下来,将二进制数分成 4 位一组。
然后,对于每组 4 位数字,将二进制数转换为一个单一数字,方法是将 4 位值中的每一位转换为相应的 2 的幂。
(千位变成 8,百位变成 4,十位变成 2,个位变成 1。但是,如果一个地方的二进制值为 0,则它保持为零。)
例如,二进制值 1111 变成 8421,而 0101 变成 0401
然后,将这些数字加起来。8421 变成 8+4+2+1 = 15,而 0401 变成 4+1 = 5。
最后,将该值转换为十六进制。如果该值在 0 到 9 之间,它在十六进制中保持该值。如果它大于或等于 10,它将更改为相应的字母:10 是 A,11 是 B,依此类推。
例如,如果我们想转换二进制数:1011111011
- 我们的数字只有 10 位,所以在左侧添加两个 0:001011111011
- 我们将我们的数字分成 4 位一组:0010 1111 1011
- 我们将每组转换为一个单一数字:0+0+2+0 = 2, 8+4+2+1 = 15, 8+0+2+1 = 11
- 我们将单一数字转换为十六进制数字:2 → 2, 15 → F, 11 → B
- 我们的十六进制数字是 2FB
考试不需要
八进制是一种以 8 为基数的记数系统,这意味着在这种记数法中只存在从 0 到 7 的数字。
例如,可以计算 754 在八进制(基数 8)中的十进制等价物 - 简单地说,就是找到 . 如前所述,它是将数字扩展为其多项式形式并将其加起来的案例
ASCII 代表美国信息交换标准代码。它是一种 7 位代码,后来改为 8 位代码,其目的是为字母和其他外来符号设置一个数字,从而允许在同一国家或使用同一种语言的计算机之间交换信息。存储在 ASCII 中的字母和符号的总数为 128 个。各国会输入他们自己的字母和符号,而不是英文。
然而,有一个主要的缺点,那就是 ASCII 只能容纳包含英文字母的符号,世界各地的计算机无法成功地相互交换信息和数据。
这个缺点导致了更大的字母和符号数据库 Unicode 的创建,它允许所有语言在 Unicode 中存储它们的字母。
尽管 ASCII 曾经是行业标准很长时间,但它根本没有足够的字符和符号来覆盖世界快速国际化。最初的解决方案是每个国家都有一个不同的组织系统,但是如果日本的人用日语字符给英国的人发邮件,那就会是一团乱麻。解决方案是 Unicode。Unicode 现在建立在 16-24 位系统上,而不是 ASCII 的 8 位系统,并且能够覆盖 149,813 个不同的字符,这足以覆盖所有语言中存在的每个字符。
截至 2024 年,最新版本的 Unicode 中包含 161 个脚本(覆盖字母、辅音字母和音节文字),尽管仍然有一些脚本尚未编码,特别是那些主要用于历史、礼仪和学术环境的脚本。此外,还对已经编码的脚本添加了字符,以及符号,特别是用于数学和音乐(以音符和节奏符号的形式)。
UTF-8 是一种在 Unicode 字符和二进制文本之间进行翻译的方法。这是通过将每个 Unicode 字符存储为最多四个单字节二进制字符串来实现的。每个二进制字符串都是通过将 Unicode 字符的代码点(形成索引的字母和数字)转换为一组二进制字符串来创建的,其中每个字符串代表代码点中的一个字符。
例如,字符“A”表示为“`U+0041`”(其中“41”是代码点),它被编码为“`01000001`”(它在十六进制中是 41)。
表示来自不同语言的字符的最佳方法是使用 Unicode。ASCII 对不同语言来说很不方便,因为它专门为英文设计,不包含任何非英文字符。同时,Unicode 拥有汉语、日语和韩语字符,以及西里尔字母和阿拉伯字母,以及来自各种语言的任何其他符号。
考试不需要
浮点数通常用 4 个字节表示。在这 32 个比特位中:1 个比特位用于表示数字的符号,8 个比特位用于表示指数,23 个比特位用于表示数字的小数部分。这是一种用科学记数法存储数字的方式。
用数学术语来说,它是通过 ±A* 计算的。符号由蓝色区域表示,A 由红色区域表示,B 由绿色区域表示。
有趣的是,如果我们要表示负数和正数(整数或小数),我们需要使用一个比特位来存储符号。如果我们只存储正数,就不需要保留符号位。
声音的表示
[edit | edit source]考试不需要
声音是如何表示/存储的?
[edit | edit source]在用麦克风录制声音后,麦克风会将声波转换为数字信号,计算机使用一种叫做采样的技术。计算机通过以固定的时间间隔对声音信号的振幅进行测量来对声音进行采样,通常为 44.1 kHz(或每秒 44,100 次),然后将这些测量结果以二进制格式保存为数字。
mp3 文件格式是如何存储和表示声音的?
[edit | edit source]图像的表示
[edit | edit source]颜色是如何表示/存储的?
[edit | edit source]我们今天在电脑屏幕上看到的颜色是由 24 个比特位的二进制数表示的。
我们知道,所有颜色都源于三种原色:红、蓝、绿。根据我们混合这三种颜色的比例,我们可以得到许多不同的颜色。因此,计算机只分析这三种原色以及它们在混合时使用了多少。这个系统被称为 RGB 表示法。
在总共 24 个比特位中,我们将它们分成 3 组,每组 8 个比特位,分别代表三种原色:蓝色、绿色和红色。
让我们先举个红色的例子。在红色中,对应的 RGB 值为:R - 255(我们可以使用的最大颜色量),G - 0(不使用此颜色),B - 0(不使用此颜色)。
因此,在 8 个比特位中,十进制数 255 可以转换为 8 个比特位的二进制数,在本例中为 11111111。因此,红色的 24 位二进制数将为 111111110000000000000000。这种情况适用于绿色(000000001111111100000000)和蓝色(000000000000000011111111)。
总结一下,步骤如下:
- 将 24 个比特位分成 3 组,每组 8 个比特位,分别代表红色、绿色和蓝色。
- 找到颜色在十进制中的 RGB 表示法。
- 将十进制的 RGB 值转换为二进制。
- 将 3 组 8 个比特位组合起来,我们就得到了颜色的最终二进制表示法。
通常,24 个比特位足以描绘逼真的颜色(照片级逼真)。但是,为了表现更逼真的颜色,可以使用更多的比特位,例如 32 个比特位或 48 个比特位。
什么是像素?
[edit | edit source].png 文件格式是如何存储和表示图像的?
[edit | edit source].jpeg 文件格式是如何存储和表示图像的?
[edit | edit source]练习
[edit | edit source]将十六进制数 F12 转换为十进制和二进制。
十进制:3858
二进制:111100010010
将十进制数 123 转换为十六进制和二进制。
十六进制:7B
二进制:1111011
将十六进制数 F0A 转换为十进制。
3850