Skip to content
~/nihildigit
Go back

How_Computers_Really_Work_02_二进制应用

在上一章中,我们将计算机定义为一种可以编程执行一组逻辑指令的电子设备。然后,我们从高层次了解了计算机中的一切,从它使用的数据到执行的指令,都以二进制形式存储,即0和1。在本章中,我将详细介绍如何使用0和1来表示几乎任何类型的数据。我们还将介绍二进制如何适用于逻辑操作。

用数字表示数据

到目前为止,我们已经集中讨论了如何以二进制形式存储数字。更具体地说,我们讨论了如何存储正整数,有时称为整数,以及零。但是,计算机将所有数据都存储为位:负数、分数、文本、颜色、图像、音频和视频等等。让我们考虑如何使用二进制来表示各种类型的数据。

数字化文本

让我们从文本开始,作为如何使用位、0和1来表示除数字以外的东西的第一个示例。在计算环境中,文本指的是字母数字和相关符号的集合,也称为字符。文本通常用于表示单词、句子、段落等。文本不包括格式(加粗、斜体)。在此讨论中,让我们将字符集限制为英语字母和相关字符。在计算机编程中,术语字符串也常用于指代一系列文本字符。

牢记文本的这个定义,我们需要精确表示什么?我们需要A到Z,包括大写和小写,这意味着A和a是不同的符号。我们还希望有逗号和句点等标点符号。我们需要一种表示空格的方式。我们还需要数字0到9。数字的要求可能会让人感到困惑;在这里,我谈论的是包括用于表示数字0到9的字符,这与存储数字0到9是不同的事情。

如果将我们刚刚描述的所有唯一符号的数量相加,大约有100个字符。因此,如果我们需要每个字符表示一个唯一的位组合,那么每个字符需要多少位?6位数字可以给我们64个唯一的组合,这还不够。但是7位数字可以提供128个组合,足以表示我们需要的100左右字符。但是,由于计算机通常使用字节,因此最好将其四舍五入,使用一个完整的8位字节来表示每个字符。通过一个字节,我们可以表示256个唯一字符。

那么,我们如何使用8位来表示每个字符?正如你可能期望的那样,已经有一种标准的二进制文本表示方式,我们稍后会介绍。但在此之前,重要的是要理解,只要运行在计算机上的软件知道我们的方案,我们就可以制定任何表示每个字符的方案。也就是说,某些方案比其他方案更适合表示某些类型的数据。软件设计师更喜欢使常见操作易于执行的方案。

想象一下,您负责创建自己的系统,将每个字符表示为一组位。您可能决定将0b00000000分配给表示字符A,将0b00000001分配给表示字符B,依此类推。将数据转化为数字格式的过程称为编码;当您解释数字数据时,它被称为解码

练习 2-1: 创建自己的文本表示系统
定义一种表示大写字母A到D的8位数字的方式,然后使用您的系统将单词DAD编码成24位。对于这个问题,没有唯一正确的答案;请参阅附录A以获取一个示例答案。
附加题:将您编码的24位数字以十六进制显示出来。

ASCII

幸运的是,我们已经有了几种标准的方式来以数字形式表示文本,所以我们不需要自己发明!美国信息交换标准代码(ASCII)是一种格式,使用7位来表示128个字符,尽管通常每个字符都使用一个完整的字节,即8位。使用8位而不是7位只是意味着我们有一个额外的前导位,保持为0。ASCII处理了英语所需的字符,另一种称为Unicode的标准处理了几乎所有语言中使用的字符,包括英语。现在,让我们专注于ASCII,以保持简单。表2-1显示了ASCII字符子集的二进制和十六进制值。前32个字符没有显示出来;它们是控制代码,如回车和换页,最初是用于控制设备而不是存储文本的。

练习 2-2: 编码和解码ASCII

使用表2-1,对以下单词进行ASCII二进制和十六进制编码,每个字符使用一个字节。请记住大写字母和小写字母有不同的值。
Hello
5 cats

使用表2-1,解码以下单词。每个字符都表示为带有空格以增加清晰度的8位ASCII值。
01000011 01101111 01100110 01100110 01100101 01100101
01010011 01101000 01101111 01110000

使用表2-1,解码以下单词。每个字符都表示为带有空格以增加清晰度的8位十六进制值。
43 6C 61 72 69 6E 65 74

答案在附录A中。

Binary Hex Char Binary Hex Char Binary Hex Char


00100000 0x20 [Space] 00100001 0x21 ! 00100010 0x22 ” 00100011 0x23 # 00100100 0x24 $ 00100101 0x25 % 00100110 0x26 & 00100111 0x27 ’ 00101000 0x28 ( 00101001 0x29 ) 00101010 0x2A * 00101011 0x2B + 00101100 0x2C , 00101101 0x2D - 00101110 0x2E . 00101111 0x2F / 00110000 0x30 0 00110001 0x31 1 00110010 0x32 2 00110011 0x33 3 00110100 0x34 4 00110101 0x35 5 00110110 0x36 6 00110111 0x37 7 00111000 0x38 8 00111001 0x39 9 00111010 0x3A : 00111011 0x3B ; 00111100 0x3C < 00111101 0x3D = 00111110 0x3E > 00111111 0x3F ? 01000000 0x40 @ 01000001 0x41 A 01000010 0x42 B 01000011 0x43 C 01000100 0x44 D 01000101 0x45 E 01000110 0x46 F 01000111 0x47 G 01001000 0x48 H 01001001 0x49 I 01001010 0x4A J 01001011 0x4B K 01001100 0x4C L 01001101 0x4D M 01001110 0x4E N 01001111 0x4F O 01010000 0x50 P 01010001 0x51 Q 01010010 0x52 R 01010011 0x53 S 01010100 0x54 T 01010101 0x55 U 01010110 0x56 V 01010111 0x57 W 01011000 0x58 X 01011001 0x59 Y 01011010 0x5A Z 01011011 0x5B [ 01011100 0x5C \ 01011101 0x5D ] 01011110 0x5E ^ 01011111 0x5F _ 01100000 0x60 ` 01100001 0x61 a 01100010 0x62 b 01100011 0x63 c 01100100 0x64 d 01100101 0x65 e 01100110 0x66 f 01100111 0x67 g 01101000 0x68 h 01101001 0x69 i 01101010 0x6A j 01101011 0x6B k 01101100 0x6C l 01101101 0x6D m 01101110 0x6E n 01101111 0x6F o 01110000 0x70 p 01110001 0x71 q 01110010 0x72 r 01110011 0x73 s 01110100 0x74 t 01110101 0x75 u 01110110 0x76 v 01110111 0x77 w 01111000 0x78 x 01111001 0x79 y 01111010 0x7A z 01111011 0x7B { 01111100 0x7C
01111101 0x7D } 01111110 0x7E ~ 01111111 0x7F [Delete]

将文本以数字格式表示相对来说是相对简单的。像ASCII这样的系统将每个字符或符号映射到唯一的一系列比特位。计算设备随后解释这一比特位序列并向用户显示相应的符号。

数字化颜色和图片

现在我们已经看到如何用二进制表示数字和文本,让我们探讨另一种数据类型:颜色。任何具有彩色图形显示器的计算设备都需要一种描述颜色的系统。正如您所料,与文本一样,我们已经有了标准的存储颜色数据的方式。我们将会介绍它们,但首先让我们设计一个自己的数字描述颜色的系统。

让我们将颜色范围限制在黑色、白色和各种灰色。这个有限的颜色集被称为灰度。就像我们在处理文本时所做的那样,让我们首先决定要表示多少种独特的灰度。让我们保持简单,选择黑色、白色、深灰和浅灰。这总共有四种灰度颜色,那么我们需要多少位来表示四种颜色呢?只需要2位。2位数字可以表示四个唯一的值,因为2的2次方等于4。

练习 2-3:创建自己的灰度表示系统
定义一种数字表示黑色、白色、深灰和浅灰的方法。没有唯一正确的答案;可以参考附录 A 中的示例答案。

设计了一种用二进制表示灰度色阶后,可以借此方法构建一个用于描述简单灰度图像的系统。图像本质上是在二维平面上排列颜色的方式。这些颜色通常以单一颜色方块(称为像素)的形式排列在网格中。下面是一个简单示例,如图 2-1 所示。

h0201.png|200

图2-1中的图像宽度为4像素,高度为4像素,总共有16个像素。如果你眯起眼睛并发挥你的想象力,可能会看到一个白色的花朵和一个深灰色的天空。这幅图像只由三种颜色组成:白色、浅灰色和深灰色。

图2-1由一些非常大的像素组成,以说明一个观点。现代电视、计算机显示器和智能手机屏幕也可以被看作是一个像素网格,但每个像素非常小。例如,高清显示器通常是1920像素(宽)乘以1080像素(高),总共约有200万像素!另一个例子是,数字照片通常在单个图像中包含超过1000万像素。

练习2-4:创建自己的简单图像表示方法

第1部分:在之前表示灰度颜色的基础上,设计一种表示由这些颜色组成的图像的方法。如果您想简化事情,可以假设图像始终为4像素乘4像素,就像图2-1中的图像一样。

第2部分:使用第1部分的方法,将图2-1中的花朵图像写成二进制表示。

第3部分:向朋友解释您表示图像的方法。然后将您的二进制数据交给朋友,看看他们是否能在不看原始图像的情况下画出上面的图像!

这并没有单一正确的答案;请参阅附录A以获取示例答案。

在练习2-4中,第2部分中,您扮演了一个负责将图像编码成二进制数据的计算机程序。在第3部分中,您的朋友扮演了一个负责将二进制数据解码成图像的计算机程序。希望她能够解密您的二进制数据并画出一朵花!如果您的朋友成功完成了任务,那太好了,这样您就一起演示了软件如何编码和解码数据!如果事情不太顺利,她最终画出的东西更像是一个泡菜而不是一朵花,也没关系;您演示了有时软件存在缺陷,导致意想不到的结果。

颜色和图像表示方法

正如前面提到的,已经为以数字方式表示颜色和图像定义了标准方法。对于灰度图像,一个常见的方法是每个像素使用8位,允许表示256种灰度。每个像素的值通常表示光的强度,所以0表示没有光强度(黑色),255表示全强度(白色),中间的值是各种灰色阴影,从深到浅不等。图2-2使用8位编码方案展示了各种灰度阴影。

h0202.png|200

表示彩色除了灰度阴影之外,也以类似的方式工作。尽管灰度可以用一个8位数字表示,但一种称为RGB的方法使用三个8位数字来表示红色、绿色和蓝色的强度,它们组合在一起形成单一的颜色。为每个三个组分颜色分配8位意味着需要24位来表示整体颜色。

RGB是基于加法色彩模型的,颜色是由红、绿和蓝光混合而成的。这与绘画中使用的减法色彩模型相反,后者混合的颜色是红、黄和蓝。

举个例子,红色在RGB中的表示方式是将所有的8个红色位都设为1,其他两种颜色的16位都设为0。或者,如果你想表示黄色,黄色是红色和绿色的组合,没有蓝色,你可以将红色和绿色位都设置为1,而将蓝色位都设置为0。这在图2-3中有示意图。

h0203.png|300

在图2-3中的两个示例中,所有”打开”的颜色都是1,但RGB系统允许红色、蓝色和绿色组成颜色的部分强度。每个组成颜色可以从00000000(0十进制/0十六进制)变化到11111111(255十进制/FF十六进制)。较低的值表示该颜色的较暗色调,而较高的值表示该颜色的较亮色调。有了这种混合颜色的灵活性,我们可以表示几乎任何想象得到的颜色。不仅有表示颜色的标准方式,还有多种常用的方法来表示整个图像。正如您在图2-1中所看到的,我们可以使用像素网格构建图像,每个像素设置为特定的颜色。多年来,已经设计了多种图像格式来实现这一点。表示图像的一种简单方法被称为位图。位图图像存储每个单独像素的RGB颜色数据。其他图像格式,如JPEG和PNG,使用压缩技术来减少存储图像所需的字节数,与位图相比。

解释二进制数据

让我们再看一个二进制值:011000010110001001100011。你认为它代表什么?如果我们假设它是一个ASCII文本字符串,那么它代表”abc”。另一方面,也许它代表一个24位的RGB颜色,使它成为一个灰色阴影。或者它可能是一个正整数,如果是这样,它在十进制中是6,382,179。这些不同的解释如图2-4所示。

h0204.png|200

那么它到底是什么呢?它可以是其中任何一个,或者完全不同的东西。这完全取决于解释数据的上下文。文本编辑程序将假设数据是文本,而图像查看器可能会假设它是图像中像素的颜色,计算器可能会假设它是一个数字。每个程序都被编写为期望以特定格式接收数据,因此单个二进制值在不同的上下文中具有不同的含义。

我们已经演示了二进制数据如何用于表示数字、文本、颜色和图像。从中可以做出一些关于如何存储其他类型数据的有根据的猜测,比如视频或音频。在数字表示中,没有什么数据类型是不能表示的。数字表示并不总是原始数据的完美复制,但在许多情况下,这并不是一个问题。能够将任何东西表示为一系列的0和1是非常有用的,因为一旦我们建立了一个处理二进制数据的设备,我们可以通过软件来使其适应任何类型的数据!

二进制逻辑

我们已经确定了使用二进制表示数据的实用性,但计算机不仅仅是存储数据,它们还允许我们处理数据。借助计算机的帮助,我们可以读取、编辑、创建、转换、共享和以其他方式操作数据。计算机使我们能够以多种方式处理数据,使用可编程执行一系列简单指令的硬件来执行这些指令,例如”将两个数字相加”或”检查两个值是否相等”。实现这些指令的计算机处理器基本上基于二进制逻辑,这是一种描述逻辑陈述的系统,其中变量只能是真(true)或假(false)两个值之一。现在让我们来看看二进制逻辑,同时我们将再次看到计算机中的一切都归结为1和0。

让我们考虑一下二进制是如何自然地适合逻辑的。通常,当有人谈到逻辑时,他们指的是推理,或者通过思考已知的事实以得出有效结论。当面对一组事实时,逻辑允许我们确定与之相关的另一个陈述是否也是事实。逻辑完全关乎真相,即什么是真的,什么是假的。同样,一个位(bit)只能有两个值,1或0。因此,一个单独的位可以用来表示逻辑状态为真(1)或假(0)。让我们看一个例子的逻辑陈述:

假设 一个形状有四条直边
而且假设 这个形状有四个直角
得出结论 这个形状是一个矩形

这个例子有两个条件(四条边,四个直角),这两个条件都必须为真,结论才能为真。为了处理这种情况,我们使用逻辑运算符AND来连接这两个陈述。如果其中任何一个条件为假,那么结论也为假。我在表2-2中表达了相同的逻辑:

四条边 四个直角 是否为矩形


False False False False True False True False False True True True 使用表2-2,我们可以解释每一行如下:

  1. 如果这个形状既没有四条边,也没有四个直角,那它不是一个矩形。
  2. 如果这个形状没有四条边,但有四个直角,那它不是一个矩形。
  3. 如果这个形状有四条边,但没有四个直角,那它不是一个矩形。
  4. 如果这个形状既有四条边,又有四个直角,那它是一个矩形!

这种类型的表格称为真值表:一种显示所有可能的条件(输入)组合及其逻辑结论(输出)的表格。表2-2是专门用于我们关于矩形的陈述的,但实际上,同样的表格适用于与AND连接的任何逻辑陈述。

以下内容省略,主要介绍了逻辑运算符AND OR XOR NOT NOR

小结

在本章中,我们介绍了二进制如何用于表示数据和逻辑状态。您了解到0和1可以用于表示几乎任何类型的数据。我们以文本、颜色和图像作为二进制格式数据的示例。我们介绍了各种逻辑运算符,如AND和OR,并学习了如何使用真值表来表示逻辑陈述。理解这一点很重要,因为当今计算机中的复杂处理器基于复杂的逻辑系统。在第4章中讨论数字电路时,我们将再次回到二进制主题,但首先,为了为该主题做好准备,我们将在第3章中进行一个小的绕道,介绍电路基础知识。我们将探讨电学原理,了解电路的工作原理,并熟悉许多电路中常见的基本组件。您甚至将有机会构建自己的电路!


Share this note on:

Previous note
How_Computers_Really_Work_01_计算概念
Next note
EffectiveC_02_对象、函数和类型