学习笔记:信息表示 (AS Level 9618)
各位未来的计算机科学家,大家好!欢迎来到计算机工作原理的基础殿堂。本章节信息表示 (Information Representation) 至关重要,因为你所见到的一切——文本、图像、声音、程序——在计算机能理解之前,都必须先转换为二进制数据 (binary data)(即 0 与 1 的序列)。
别担心,如果数字不是你的强项也没关系。我们将会把复杂的转换过程与概念拆解成简单易懂的步骤,并辅以大量的实例!让我们一起深入了解计算机的语言吧。
1.1 数据表示
二进制数量级:Kibi 与 Kilo
在计算机科学中,我们经常处理海量的数据,因此会使用 Kilobyte、Megabyte 和 Gigabyte 等词头。然而,这些词头有两套截然不同的标准:十进制 (Decimal/SI) 与 二进制 (Binary/IEC)。
十进制词头 (Kilo, Mega, Giga, Tera)
• 基于 10 的幂次方。
• Kilo (k): \(10^3 = 1000\)
• Mega (M): \(10^6 = 1,000,000\)
• Giga (G): \(10^9 = 1,000,000,000\)
• Tera (T): \(10^{12} = 1,000,000,000,000\)
• 例子:1 公里 (Kilometre) 等于 1000 米。
二进制词头 (Kibi, Mebi, Gibi, Tebi)
• 计算机偏好使用 2 的幂次方(因为它们使用二进制)。这些词头用于描述计算机内存与存储容量,尽管业界常误用 SI 词头。
• Kibi (Ki): \(2^{10} = 1024\) (Kibibyte)
• Mebi (Mi): \(2^{20} = 1,048,576\) (Mebibyte)
• Gibi (Gi): \(2^{30}\) (Gibibyte)
• Tebi (Ti): \(2^{40}\) (Tebibyte)
关键差异:当你在市场营销中看到 'kilo' 或 'mega' 时(如硬盘容量),通常指的是十进制系统(10 的幂次方)。但在编程中计算内存地址或文件实际大小时,二进制系统(2 的幂次方,即 1024)才是正确的标准。
请务必记住差别:kilo 是 1000,kibi 是 1024。其中的 'i' 代表 'binary'(二进制)。
数制与转换
计算机依赖不同的进位制。你必须具备在这些进位制之间转换整数的能力。
十进制 (Denary, Base 10)
我们日常生活使用的数字系统,包含 10 个数字 (0–9)。
二进制 (Binary, Base 2)
计算机的原生语言,仅使用两个数字 (0 与 1)。每一个数字称为一个比特 (bit)。
十六进制 (Hexadecimal, Base 16)
使用 16 个字符 (0–9 及 A–F)。由于 4 个比特可以精确转换为 1 个十六进制数字,它常被用作二进制的简写,让人们更容易阅读和调试长串的二进制代码。
步骤说明:十进制转二进制(及十六进制)
将十进制数字 156 转换为 8-bit 二进制,再转换为十六进制。
步骤 1:设置权重(2 的幂次方):
\(128 \quad 64 \quad 32 \quad 16 \quad 8 \quad 4 \quad 2 \quad 1\)
步骤 2:找出能放入 156 的最大权重:
\(156 - 128 = 28\)。所以,128 比特为 ON (1)。
步骤 3:继续处理余数 (28):
64 (太大,为 0)。32 (太大,为 0)。16 (可放入:\(28 - 16 = 12\))。所以,16 比特为 ON (1)。
步骤 4:继续处理余数 (12):
8 (可放入:\(12 - 8 = 4\))。所以,8 比特为 ON (1)。
4 (可放入:\(4 - 4 = 0\))。所以,4 比特为 ON (1)。
2 (0)。1 (0)。
结果 (二进制): \(1 \quad 0 \quad 0 \quad 1 \quad 1 \quad 1 \quad 0 \quad 0\)
步骤 5:将二进制转为十六进制:
将 8 个比特分为两个半字节 (nibble,各 4 比特):
第一组:1001 (权重:8+1 = 9)
第二组:1100 (权重:8+4 = 12,十六进制对应为 C)
结果 (十六进制): 9C
小知识:十六进制通常会在数字前加上井号 (#) 或符号 (&),例如 #9C 或 &9C,在编程中也常写作 0x9C。
二进制编码十进制 (BCD)
BCD 是另一种使用二进制来表示十进制数字的方法,主要用于显示器及简单的算术电路。在 BCD 中,每个十进制位数分别由其专用的 4-bit 二进制代码表示。
例子:十进制 156 的 BCD 表示:
1 变成 0001
5 变成 0101
6 变成 0110
结果 (BCD): 0001 0101 0110 (总共 12 比特)。
BCD 的空间效率较低(156 在纯二进制中仅需 8 比特),但非常适合数字时钟或计算器等硬件直接显示数字的应用。
表示负整数:补码 (Two's Complement)
计算机如何存储负号?它使用补码 (Two's Complement) 系统。此系统能让我们一致地表示正整数与负整数,并使二进制减法变得简单(实际上变成了加法!)。
最左边的比特(即最高有效位,MSB)被用作符号位 (Sign Bit):
• 若 MSB 为 0,数字为正数。
• 若 MSB 为 1,数字为负数。
步骤说明:正十进制转负数补码
将 -45 转换为 8-bit 补码。
1. 找出正数的二进制:
+45 的 8-bit 二进制为 0010 1101。
2. 进行反码 (One's Complement)(按位取反):
将所有 0 变为 1,1 变为 0。
0010 1101 变为 1101 0010。
3. 进行补码运算(加 1):
\(1101\ 0010 + 1 = 1101\ 0011\)
结果: -45 的 8-bit 补码为 1101 0011。注意 MSB 为 1,代表负数。
二进制加法与减法
二进制加法遵循简单规则:
• \(0 + 0 = 0\) (进位 0)
• \(0 + 1 = 1\) (进位 0)
• \(1 + 1 = 0\) (进位 1)
• \(1 + 1 + 1 = 1\) (进位 1)
二进制减法:计算机通过补码执行减法。要计算 A - B,计算机只需计算 A + (-B),其中 -B 是以补码形式表示。
了解溢出 (Overflow)
当算术运算结果过大(或过小),导致无法存储在分配的比特数(例如 8 比特)内时,就会发生溢出 (Overflow)。
例子:如果我们使用 8 比特补码,最大正值为 +127 (0111 1111)。如果将 127 加 1,结果 (128) 会导致 MSB 变为 1 (1000 0000)。由于 MSB 现在是 1,计算机危将该数字解释为负数(在补码中为 -128),从而引发溢出错误。
字符集 (ASCII 与 Unicode)
文本字符 (A, b, !, 5) 也必须存储为二进制。字符集 (character set) 是一种标准化映射系统,为每个字符分配唯一的二进制代码。
• ASCII (美国信息交换标准代码):原始标准。使用 7 比特,提供 128 个不同字符 (0 至 127)。这涵盖了英文大小写字母、数字及基本符号。
• 扩展 ASCII (Extended ASCII):使用 8 比特,提供 256 个字符 (0 至 255)。这包含了更多地区性字符与图形符号。
• Unicode:现代标准。它使用 16、24 或 32 比特,容纳数百万个唯一字符。这对于全球化文本显示至关重要,涵盖所有语言、表情符号及数学符号。
重点总结 (1.1):数据即原始的二进制。我们使用十六进制等系统来提高人类工作效率,使用补码处理带符号的整数,并使用特定的字符集(如 Unicode)将原始比特映射为具意义的符号。
1.2 多媒体表示
多媒体数据(图片与声音)相当复杂,必须从真实世界的模拟 (analogue)(连续)形式转换为数字 (digital)(离散的二进制)数据。
图形:位图 (Bitmapped Images)
位图 (bitmap image)(如 JPEG 或 PNG)是由个别彩色点组成的网格,这些点称为像素 (pixels)。
编码位图
1. 像素数据:每个像素被分配一个二进制代码,代表其颜色。
2. 色彩深度 (Colour Depth / Bit Depth):用来表示单个像素颜色的比特数。色彩深度越高,可呈现的颜色就越多。
色彩数量 = \(2^{\text{色彩深度}}\)
(例如:8 比特 = 256 色;24 比特 = 1670 万色。)
3. 图像分辨率:图像中的像素数量 (宽 x 高)。
4. 文件头 (File Header):包含有关图像结构的重要信息(如文件类型、图像分辨率、色彩深度)。
计算位图文件大小
文件大小取决于总像素数与每个像素使用的色彩深度。
公式 (单位为 bit):
\(\text{文件大小} = \text{图像宽度 (像素)} \times \text{图像高度 (像素)} \times \text{色彩深度 (bits)}\)
若要换算为 bytes,请将结果除以 8。
变更元素之影响
• 提高图像分辨率:存储更多像素,带来更高质量的图像,但文件大小会按比例增加。
• 提高色彩深度:每个像素使用更多比特,呈现更广的色彩范围(质量更高),但文件大小亦会按比例增加。
图形:矢量图 (Vector Graphics)
与位图不同,矢量图 (vector graphics)(如 SVG)不存储像素数据。相反,它们存储关于如何绘制图像的数学指令(绘图列表 (drawing list))。
• 绘图对象 (Drawing Object):基础几何形状(如圆形、线条、矩形)。
• 属性 (Property):对象的特征(如线条粗细、颜色、位置、填充样式)。
选用理由:位图 vs 矢量图
特性对比:
• 缩放:位图画质会下降(出现像素化);矢量图完美缩放(重新计算数学值)。
• 文件大小:位图取决于分辨率和色彩深度,复杂照片文件较大;矢量图通常较小,取决于对象的复杂度。
• 实际应用:位图用于照片、含细微阴影的复杂图像;矢量图用于标志、字体、技术图纸、简单图形。
选用技巧:如果图像需要频繁缩放而不损失质量(如将公司标志放在广告看板与信头上),则选用矢量图。
声音表示
声音本质上是模拟波。为了数字化存储,我们必须通过采样 (sampling) 过程进行转换。
采样过程
1. 模数转换器 (ADC):将连续的模拟声波转换为数字形式。
2. 采样:定时测量声波的振幅(音量)。
3. 采样率 (Sampling Rate / Frequency):每秒采样的次数(以 Hertz, Hz 为单位)。较高的频率意味着测量更频繁,能更准确地捕捉声波。
4. 采样分辨率 (Sampling Resolution / Bit Depth):分配给每个样本存储振幅值的比特数。分辨率越高,可表示的音量细节就越丰富,提升准确度。
类比:想象录音就像制作定格动画。采样率是你每秒拍摄的照片张数,而采样分辨率则是每张照片的细节(色彩深度)。
对文件大小与准确度的影响
提高采样率或采样分辨率会大幅提升音质(准确度),但存储声音所需的总比特数也会增加,导致文件变大。
1.3 压缩 (Compression)
数据压缩至关重要,因为现代文件(特别是多媒体)极为庞大。压缩可缩小文件体积,从而节省存储空间并缩短网络传输时间。
有损压缩 vs 无损压缩
主要有两种类型的压缩,理解其差异对于阐述选用理由非常重要。
1. 无损压缩 (Lossless Compression)
• 定义:原始数据可以从压缩后的文件完美重现。信息不会永久丢失。
• 用途:用于每个比特数据都至关重要的文件,如文本文档、可执行程序及医疗影像。
• 例子:ZIP, PNG, GIF, 行程编码 (RLE)。
• 缺点:压缩率通常较低(文件仍然相对较大)。
2. 有损压缩 (Lossy Compression)
• 定义:压缩过程中会永久舍弃不可逆的数据。这些数据通常是人眼或人耳最不容易察觉的部分。
• 用途:用于对质量细微下降可接受,但需大幅缩小文件体积的多媒体。
• 例子:JPEG (图片), MP3 (音频), MPEG (视频)。
• 缺点:永久性的画质或音质退化。
选用理由例子:若你要发送一份科学数据文件,必须使用无损压缩以维持数据完整性。若你是在社交媒体上传照片,有损压缩 (JPEG) 是可以接受的,因为文件大小比微小的细节更重要。
压缩方法:行程编码 (Run-Length Encoding, RLE)
RLE 是一种简单且常见的无损压缩形式,对于含有长串重复数值(即数据冗余)的数据特别有效。它的原理是记录数值及其连续出现相同数值的次数(即“行程”)。
RLE 如何运作(文本例子)
想象一串文本或简单的黑白位图行:
原始数据: WWWWWWWBBBWWRRRR
RLE 编码:我们将它编码为 (数量, 数值):
\((7, W), (3, B), (2, W), (4, R)\)
应用于不同文件类型:
• 文本文件:若含有长串相同字符(如大量空格或 Tab),效果显著。
• 位图:对于大面积纯色的简单图像效果很好。
• 矢量图:较不相关,因为矢量图是由数学指令定义的,而非序列像素数据。
• 声音文件:若存在静音期(长串零振幅样本),可使用此方法。
无损:质量完美,文件较大 (ZIP)。用于关键数据。
有损:质量降低,文件大幅缩小 (JPEG, MP3)。用于非关键多媒体。
RLE:(行程编码)一种无损方法,通过统计重复值出现的次数来进行编码。