二进制数字

之前我们制作出了逻辑门,让计算机可以表示逻辑“真”或“假”。但是只靠这两个状态,我们没法表达更多的信息,这时,我们就需要了解一些数学了。别紧张,这个可能比你初中学的数学还要简单!

用一个二进制的数可以表示“真”或“假”,我们用数字的方式计为“1”或“0”。想要表达更多的信息怎么办呢?让我们想想十进制的数,一个数字可以表示0~9,如果想表示10以上的数字,我们就在前面加上一位,就能表示出0~99的数字。二进制也是同样,通过在前面添加位数,可以表达更多的信息。

用十进制举例来说,数字 183 代表了什么呢?它表示了1个100,8个10以及3个1全部加起来:

183 == 1*100 + 8*10 + 3*1

注意我们乘的每个数都比右边的大10倍,因为每一位数字可以表示10个数字(0~9),只有超过9的才会加一位。这样基于每一位都有10个数字的计数方式,就是十进制。

二进制的原理是一样的,只不过它每一位只有2个可能的数字(0、1),所以我们要乘的每个数都比右边的大两倍,不再是100、10、1,而变成了4、2、1。比如说二进制数101,就代表了1个4、0个2、1个1相加,等于十进制的5:

101 == 1*4 + 0*2 + 1*1

为了表示更多的信息,我们会有更长的二进制数,比如说10110111,就代表了十进制的183:

10110111 == 128*1 + 0*64 + 1*32 + 1*16 + 0*8 + 1*4 + 1*2 + 1*1 == 183

二进制计算

二进制的加减计算也很简单,我们同样还是从十进制举例。当我们计算183 + 19 的时候,我们从个位开始,每一位对应相加,如果加出来的结果大于10,就向下一位进一位:

deci-plus--1-

同样,我们用二进制来计算,结果是一样的:

binary-plus--1-

计算机中的二进制数

计算机中,二进制数的每一位叫做“比特(bit)”。一个8个比特的数字最小是0,最大是11111111(255),总共能表示256个,也就是2的8次方个不同的数字。

在计算机中,我们处理的二进制位数都是8位的倍数,以至于我们给每8个比特单独起了个名叫做“字节(Byte)”。你可能听过 KB 、MB、GB、TB,他们的单位都是字节,前面的字母代表了数量级:KB 代表一千字节,MB 代表一百万字节,GB 代表十亿字节,而 TB 就代表了一万亿个字节,也就是8万亿个“0”和“1”!

以前我们玩的“8位机”,就代表他们的数据都是用8个比特来表示的。而现在的计算机一般都是64位机。

一个“8位图像”,就代表它每一个像素点的颜色由8个比特来表示,也就是每个点可以有256种可能的颜色;而“32位图像”就表示每个点可能有2的32次方,也就是 4,294,967,296 这么多种颜色,那可清晰多了!

image-35
8位图片
image-37
64位图片

负数、非整数

并不是所有的数字都是正数,一般计算机会用第1位作为标志位来表示正负,“1表示”是负数,“0”表示是正数。例如一个32位的数,第一位表示正负,剩下的31位表示数字,能表示的范围就大概是 -2,147,483,648~2,147,483,648。

表示小数的规则相对复杂些,目前较常用的是 IEEE 754 标准。它将32位数设置成了1个正负标志位(S)8个指数位(E),23个有效数字位(M),最后表示的数字(V)计算公式如下:

image-38

ASCII 码,计算机中的字符表示

除了数字以外,计算机还通过给每个字符编上代码的方式,用二进制来表示文字。1963年发明的 ASCII 码(美国信息交换标准代码)一直通用到现在。ASCII 码由7位二进制数表示,可以表达128个不同的字符,包括了大写字母、小写字母、数字0-9,大部分标点符号及一些换行符、制表符等特殊符号。

比如说:字母‘A’就由65表示,字母‘b’是由98表示,标点‘!’就用33表示等等。

v2-c4b8bfebb149f9ad4e997f9b26db31bd_hd
ASCII 码表

UNICODE

ASCII 码简单易用,它使用不长于一个字节长度的二进制编码来解决了字符的问题。但是,ASCII 码却有个明显的缺陷:它只能供英语使用,其他国家的文字,比如中文有数千个常用字,根本没法用一个字节来编码。

各个国家都研究了自己的多字节编码方案,但因为各个国家的编码方案互不通用,导致在不同系统之间,就会产生乱码问题。例如,以前我们玩台湾或日本开发的计算机游戏,打开是乱码显示,需要使用转码器才能正常玩耍,就是这个原因。

1992年,Unicode 诞生了,它统一了所有编码的标准,解决了不同国家不同编码标准的问题。常见的 Unicode 是16位的,可以表达超过一百万个字符,足够覆盖所有语言的每个字符了——100多种语言的字母(文字)大概占了12万个位置、剩下的还可以表示各种标点符号、数学符号、甚至 Emoji 表情!

其他编码

除了 ASCII 码,Unicode 编码表示字符以外,还有其他常见的例如 MP3、PNG、MP4 等等各种编码格式,可以用来表达声音、图片、视频等信息。我们在计算机中见到的照片、音乐、电影、游戏、网页、甚至操作系统,它们归根到底都是一串很长的“0、1”比特!

之后

了解了计算机基本的表达形式:二进制,以及它的计算以及编码。接下来,我们就会真正走进计算机的“计算”方式,看看在计算机内部是怎么操作这些二进制,来帮助人们完成工作的。下期见~