前言
这是本系列的第一篇,目标受众是0基础的,想学编程的人。
二进制
说起二进制,首先想到的是十进制。平时我们数数,就是用的十进制,为什么叫十进制呢?因为数的过程中,从0开始,每次+1,都会让数增大,但位数不变,都是1个数字,直到9+1=10,这时,1个数字不够用了,用了2个数字,这两个数字组合成一个新的数。这就叫进1。所谓的进1,也就是个数,准确的说,是位数,增加1个。十进制,就是逢十进一。个位进一位到十位,十位进一位到百位。
类比十进制,二进制,就是逢二进一,这时就不能叫个位,十位,百位了,叫第0位,第1位,第2位……。
第0位,逢二进一,那数的时候,0,表示0,1,表示1,10呢?表示的是2,11呢?表示的是3。但是我们也发现了,单独写10,看不出是十进制的十,还是二进制的10,为了区分,就需要用一个标识。计算机里用的是0b前缀表示二进制,而十进制,不用加前缀。
下面是二进制数对0-10的数据的表达。
二进制 | 十进制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | 10 |
为什么用二进制
明明大家都是用的十进制,为什么要发明二进制呢?因为二进制方便计算机计算。为什么计算机方便用二进制计算呢?
二进制的基本数字,就是0,1,而十进制的基本数字是0-9,你能想到什么样的电路可以实现0-9的表达么?在电学里,电信号,一般就是电压、电流、电容、电感、电阻。要想找到不的数字的表达,这些表达就需要分成不同的等级,类似楼梯一样。如果是用电压来表示0-9的数字,按前面分析的,需要找到10个不同的等级来分别表示0-9,而二进制呢,只需要用2个不同的等级来表示0,1,很明显,二进制更简单一些。而十进制要复杂的多。所以,在电子计算机里,二进制得到了广泛的应用。
题外话:在以前,计算机也并不全是二进制的,苏联曾经开发出三进制的计算机,后面应用范围远不及二进制的,也就慢慢消失了。
其他进制
事实上,我们生活中也不只是有十进制,还有十二进制,就是时间,上午1点到12点,下午又是1点到12点。
在计算机领域中,除了二进制、十进制,还有十六进制、八进制。实际用的多的,就是二进制、十六进制和十进制。
数据的存储
可以存数据的东西,有光盘、磁带、硬盘等等,以上这些,存储的原理多少有些不同,但是本质是一样的。它们存的都是0或1,像光盘,是用激光在盘面上烧刻出不同长度的沟,短的是0,长的是1,磁带,是用强磁让磁带一段一段的磁化,留下不同长度的磁条,长的磁条是1,短的磁条是0。磁盘与磁带相似。
也就是说,他们都是存的0或1,用留下的记号的不同来标识。
扯个题外话。0或1这样的数据,本身是不连续的,因为在0和1之间还有无穷多个小数。这些不连续的数据,也被称为离散的数据,那计算机中有连续的数据么?很不幸,没有。计算机中不能直接处理和存储连续的数据。比如一段音乐,如果是用胶片存,胶片存的就是连续的,而CD盘,就不是连续的。那离散的为什么听不出来?同一段音乐,为什么又有胶片存的,又有CD存的,还有MP3文件存的?这些就涉及到了一些模数转换和数模转换了。简写为A/D转换(模数转换),D/A转换(数模转换)。
回到正题。从前面知道,数据计算机中存的是0,1这样的数。但是这些数要想好记,就需要给他们分个段,就像背电话号码,大家都用335或344的方式来分段记忆。同样,为了方便对二进制进行管理,在存储的时候,也对二进制进行了分段。
对于单一1个0或1,叫做一个bit,或比特,翻译过来,就是位。8个bit,就像前面写0-10那样,8个0/1组合,叫做一个字节,byte,为什么是8bit一个字节呢?因为最早计算机是美国搞的,他们把常用的字符编了一个表,用不同的数字表示不同的字符,刚好是127个,也就是7位,7这个数不利于分段,就搞了8位,4位一段。刚好8是2的3次方,8位最多可以表示2的8次方(255)个数。
数据在存储的时候,也是遵循这样的规律,最小的单位是1bit,但是这个单位太小了,就像分是中国货币的最小单位,但是现在很少有人直接说多少分,最少也是多少元。数据在存的时候也是,bit这个单位太小了。比bit大一级的,就是字节,byte,这个用的多一些。也是实际使用中,存储的最小单位。
计算机的数据存储,可以想像成一个大箱子,为了方便收纳,大箱子里又分了很多的区域,每个区域里又分了很多的格子。一个格子里只能存一个字节的数据,这一个字,就是最小的一个存储单元。在硬盘中,这个箱子,就对应着整块硬盘,不同的区域,就是不同的扇形区域,简称扇区,每个扇区下,又包括许多的字节。
数据索引
有过找东西经验的都会发现一个问题。东西是存起来了,但是想找的时候,如果没有提前记录存储位置,找起来就要一个格子一个格子的翻找,效率很低。怎么解决呢?一个很容易想到的方法是提前做一个记录,一条一条的记录着每个格子里存的是什么。这个记录表,不能离开这个箱子,他也要存在箱子里。当你有很多箱子的时候,为了方便找这个记录表,最好的方法是把这个表放在一个固定位置。硬盘里也是这样,在开始的位置,有一个文件记录表,记录表里记录着很个格子里都有什么内容。想要找某个东西的时候,先到这里找到记录表,再在记录表中找有没有想要找的东西。
这里忽略了一个问题,就是格子很多的时候,怎么区分不同的格子呢?聪明如你,给格子编上号就好了。按照一个固定的顺序,把每个格子都编上号码。这样,在找到要找的东西时,就知道了东西所在格子的编号。这像极了门牌号,所以,这个编号,又可以叫它 “地址”。当你开始在记录表中找要找的东西到你找到它的这段时间,在计算机里,叫 寻址。