维基少年:事物如何运作/二进制数
大多数人使用十个不同的数字——0 到 9——来写数字。例如,数字 15、987630、100、99 和 6 都由这十个数字中的一个或多个组成。
这被称为十进制数制或十进制,这意味着这种数制有十个不同的数字来构成一个数字,与 (大多数) 人的手指数量一样多。
但计算机的构建并非基于十进制数制。这是因为计算机是用电子电路构建的,每个部分都可以处于开或关状态。由于只有两个选项,它们只能表示两个不同的数字,0 和 1。这被称为二进制数制或二进制。("Bi" 表示二。) 所有数字都是用两个数字0 和 1 构成的。二进制中的一个数字 (即 0 或 1) 也被称为位——它是二进制数位的简称。
计算机使用这种数制进行加、减、乘、除以及其他所有数学和数据操作。它们甚至以位的形式保存数据。
一个位本身只能表示零或一,因此要表示更大的数字 (甚至表示字母),它们将位组合在一起形成块。八个位构成一个字节,计算机使用它们需要的字节数来存储我们所需的信息。现代计算机有数百亿字节的存储空间。
这本书将教你如何理解二进制,为什么计算机使用它以及它们如何使用它。
在正常的数学运算中,我们不使用二进制。我们被教导使用我们通常的数制。二进制在数学运算中比普通数字容易得多,因为你只需要使用两个数字符号——1 和 0,而不是十个数字符号——0、1、2、3、4、5、6、7、8 和 9。
计算机使用二进制是因为它们只能读取和存储开或关的电荷。因此,使用 0 表示“关”、1 表示“开”,我们可以在电线中使用数字。想象一下,如果每种数学符号 (0 到 9) 都有一种颜色,那么你就会有十种颜色。要记住这么多颜色非常困难,但你已经做到了。如果你只限于黑白两种颜色,你将只有两种颜色。记住它们会容易得多,但你需要想出一种新的数字记录方式。二进制就是如此——一种新的记录和使用数字的方式。
在学校里,你被教导了我们有 ones、tens 和 hundreds 列,等等。每列的值都是其右侧列值的十倍。这意味着如果第一列的值为 1,则第二列的值为 10,第三列的值为 100,依此类推。要找到某列中一个数字的值,你将数字乘以该列的值。如果你以前从未见过列的模型,它看起来像这样
十进制列 | 10,000 | 1000 | 100 | 10 | 1 |
---|---|---|---|---|---|
数字 | 5 | 4 | 9 | 3 | 6 |
值 | 5 × 10,000 | 4 × 1000 | 9 × 100 | 3 × 10 | 6 × 1 |
所以十进制数字 54,936 等于 5×10000 + 4×1000 + 9×100 + 3×10 + 6×1。
二进制也有列,但每列的值都是其右侧列值的二倍。你仍然以相同的方式确定数字的值,将位的 (0 或 1) 值乘以其列数字的值 (128、64、32 等等),如下所示
二进制列 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
位 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
值 | 1 × 128 | 0 × 64 | 1 × 32 | 1 × 16 | 0 × 8 | 1 × 4 | 0 × 2 | 1 × 1 |
所以二进制数字 10110101 = (1×128) + (1×32) + (1×16) + (1×4) + (1×1) = 181 (十进制)。
上述方法使我们能够读取二进制数字,但我们如何编写它们呢?一种方法是编写从一开始的所有数字的列表,并向上工作。就像在十进制中将 1 加到 9 会进位到 10 一样,1 + 99 会进位到 100,在二进制中,当你将 1 加到 1 时,你会将 1 进位到左侧的下一个位置。按照此表格的步骤,了解它是如何工作的。
十进制 | 二进制 |
---|---|
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
13 | 1101 |
14 | 1110 |
15 | 1111 |
16 | 10000 |
你会注意到,二进制中的值 1、2、4、8 和 16 只有一个 1 位和一些 0 位。如果你回到二进制列,你可能会注意到每个值都有一个对应的列。如果你在列中写下数字,你只需要在与你正在编写的数字具有相同值的列中写下 1 即可。所有其他列都将是零。十进制的工作方式相同!当你编写一个与十进制列之一具有相同值的十进制数字 (例如 100) 时,你只需要在与你正在编写的数字相等的列中写下 1。你将在其他列中放置 0。
十进制版本 | 二进制 |
---|---|
1 | 1 |
2 | 10 |
4 | 100 |
8 | 1000 |
16 | 10000 |
你是否在编写二进制数字时发现了一种模式?再次研究 1 到 16 的表格,直到你明白为什么在二进制中,
- "1 + 1 = 10" 和 "1 + 100 = 101"
以你自己的方式。
你可能在读取十进制数字方面有很多练习,但在读取二进制数字方面还没有任何练习,因此读取二进制数字感觉很慢是正常的。
如果你想编写一个更大的数字 (例如 86),该怎么办?你可以使用上面显示的列表方法,但这将花费很长时间!一种更快捷的方法涉及使用列
- 找到值最大但仍然小于或等于你正在编写的数字的列,并在该列中写下 1。对于 86,你将在 sixty-fours 列中写下 1,因为 64 小于 86,但左侧的下一列 (128) 大于 86。
- 查看你上一步中使用的列右侧的下一列。如果你可以将该列的值加到前一列的值,并将得到一个小于或等于你正在转换为二进制的数字,那么就在那里写下 1。如果不是,则写下 0。在 86 的示例中,你使用的第一列的值 (64) 加上右侧下一列的值 (32) 等于 96。96 大于 86,因此你将在 thirty-twos 列中写下 0。
- 找到你最后写下的列右侧的下一列。如果将该列的值加到所有具有 1 的列的值之和,将得到一个小于或等于你的数字,那么就在该列中写下 1。如果不是,则写下 0。对于 86,下一列将是 sixteens 列。16 加上所有之前具有 1 的列的值之和 (在本例中为 64) 等于 80。80 小于 86,因此你将在 sixteens 列中写下 1。
- 重复步骤 3,直到所有具有 1 的列的值之和等于你试图找到的数字。一旦发生这种情况,用零填充任何剩余的列。
下表显示了 86 的完整过程
二进制列 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|---|
此数字可以容纳吗? | 否。总计将为 128,并且 128>86。 | 是。总计将为 64,并且 64<86。 | 否。总计将为 96,并且 96>86。 | 是。总计将为 80,并且 80<86。 | 否。总计将为 88,并且 88>86 | 是。总计将为 84,并且 84<86。 | 是。总计将为 86。 | 否。总计将为 87,并且 87>86。 |
位 | 可以在此处放置 0,或者可以留空。 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
总计 | 0 | 64 | 64 | 80 | 80 | 84 | 86 | 86 |
52 的二进制数是 110100。如何读取二进制数呢?
- 从个位数开始看。由于它包含 0,所以不需要加任何东西到总和中。
- 然后查看十位数。没有,所以我们继续下一列。
- 百位数包含 1,所以我们把 4 加到总和中(总和为 4)。
- 跳过千位数,因为它是 0,我们遇到万位数,它包含 1。我们将 16 加到总和中(总和为 20)。
- 最后,十万位数包含 1。我们把它加到总和中(总和为 52)。
完成了!我们现在得到总和为 52。读取二进制数的基本方法是,如果某位数包含 1,就把该位的数值加到总和中。你不需要像十进制那样乘以权值来获得总和(例如十进制中的 5 在十位数上的权值为 10),因为唯一的数字是 0(记住,0 乘以任何数都等于 0)和 1(记住,1 乘以任何数都等于另一个数)。不需要乘法可以帮助你更快地读取二进制数。让我们在表格中查看 110100。
二进制位 | 位值 | 二进制位的数值 |
---|---|---|
0 | 1 | 0 |
0 | 2 | 0 |
1 | 4 | 4 |
0 | 8 | 0 |
1 | 16 | 16 |
1 | 32 | 32 |
总计 | 52 |
现在让我们看另一个数。
二进制数是 1011,但我们不知道它代表什么。让我们通过逐位读取的方法找出这个数。
- 个位数包含 1,所以我们将 1 x 1 加到总和中(总和为 1)。
- 十位数包含 1,所以我们将 1 x 2 加到总和中(总和为 3)。
- 百位数包含 0,所以我们将 0 x 4 加到总和中(总和仍然为 3)。
- 千位数包含 1,所以我们将 1 x 8 加到总和中(总和为 11)。
我们完成了,所以总和就是答案。答案是 11!这里有一些你可以练习的数字。
计算机以二进制形式存储所有内容,包括文本。为此,每个字母,每个标点符号,事实上是人们用过的大量符号,都在一个叫做 Unicode 的系统中被赋予了自己的数字。
例如,如果你的名字是“George”,那么计算机可以通过存储“G”的数字,然后是“e”,等等来以二进制形式存储它。美式英语中最常用的符号,比如没有重音的字母,可以用一个字节存储。其他符号,比如“£”和“¿”,需要多个字节,因为它们被赋予了更大的数字。以下是一些例子
整个单词“George”看起来像
0100 0111 0110 0101 0110 1111 0111 0010 0110 0111 0110 0101
虽然这可能看起来像乱码,看看你是否能找到剩下的字母以及它们对应的十进制表示!