涂小图
在日常生活中,我们的大脑对很多事物都形成了习惯。比如数字,习惯于使用十进制的我们能够轻易地算出“1+1=2”,但是却很难对计算机里的二进制数字有直观的感受。十进制在今天的普遍使用,只不过是人类在生物学上一次偶然进化的结果而已:我们当中的绝大多数人,生来就有10个手指、10个脚趾。除了十进制,二进制、八进制等其他进制又有什么不同呢?
十进制与二进制
十进制计数的规则:①基数为10;②有0—9共10个数字;③逢10进1,借1当10。
二进制计数的规则:①基数为2;②有2个数字,即0和1;③逢2進1,借1当2。
十进制数可以由多位组成,从右向左依次为个位、十位、百位、千位、万位,等等;与此类似,二进制也可以由多位数组成,从右向左分别为1位、2位、4位、8位、16位,等等。同学们是不是感觉二进制的位数很奇怪,中间似乎还缺了好多位?其实这是我们从十进制数的角度来看二进制数而产生的一种错觉。
如上表所示,当二进制产生进位时,对应的十进制数为2、4、8、16、32、64、128……二进制虽然只有0和1两个数字,但是由于数字所处的位置不同,表示的数据也不同。例如二进制数1011共有4位,由3个1和1个0组成,各个数字所处位置不同,所代表的大小也不同,各个数字所处位置在数学上称作“权”。
二进制数1011从右向左顺序各位表示的含义:第一个1表示1的个数,第二个1表示2的个数,第三个0表示4的个数,第四个1表示8的个数。同学们可以类比一下:十进制数1011是由1个1000、0个100、1个10、1个1组成的;二进制数1011是由1个23、0个22、1个21、1个20组成的。
按二进制数1011各位的权列出:1101(二进制)=1×23+0×22+1×21+1×20=11,按这种权展开式,可以很方便地将二进制数转换为十进制数。
相应地,十进制数转换成二进制数通常采用“除2取余,逆序排列”的方法。具体做法是用2整除十进制数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数;如此反复,直到商为0而止。然后,再把先得到的余数作为二进制低位,后得到的余数作为二进制高位,依次排列。
举个例子,将十进制数11转换为二进制数1011:
11÷2=5……1
5÷2=2……1
2÷2=1……0
1÷2=0……1
目前几乎所有的计算机内部的逻辑电路都采用了二进制,这是因为电路中通常只有两个状态,如开关的“开”和“关”、电压的“高”和“低”、电流的“正”和“负”等,这些状态正好可以用数字“1”和“0”表示,十分方便。采用二进制可以使计算机的结构更加简单可靠,提高计算速度。
二进制的计算规则
【加法】只有以下4种可能(逢2进1):
0+0=0
0+1=1
1+0=1
1+1=10
对于多位二进制数相加,进位采用“逢2进1”的方式,如表2所示,同学们可以动手列出竖式尝试计算。
对于多位二进制数相减,借位采用“借1当2”的方式,如表3所示,同学们可以动手列出竖式尝试计算。
【乘法】只有4种可能:
0×0=0
1×0=0
0×1=0
1×1=1
十进制的乘法怎么算?相信这可难不倒各位同学,毕竟大家在小学时就已经把九九乘法表(乘法口诀)背得滚瓜烂熟了,而二进制的乘法规则相对来说还要更简单。二进制的乘法可以很简单地转换为各位的加法运算,如表4所示,同学们可以动手列出竖式尝试计算。
我们知道,除法是乘法的逆运算,二进制乘法有4种可能,那除法为什么只有2种呢?这是因为0作为除数是没有意义的。如表5所示,同学们可以动手列出竖式尝试计算。
至于比较复杂的乘法和除法运算,都能简单地转换为加、减和各位的位移操作,所以一般简单的计算机只需设计一个加法器来控制位数变动即可。
古代也有进制概念
明白了二进制的原理,八进制也就很容易懂了。其实我们可以从中国古代历史中找到二进制、八进制的概念,比如八卦。八卦最初其实是古人的一种哲学思想、文字的表述符号,只是后来因为被不少“算命先生”用来忽悠人,而被打上封建迷信的标签。在八卦中,其实也有二进制和八进制的概念,八卦的基本元素就是阴和阳,我们可以把它们看作二进制中的0和1。需要说明的是,八卦和现代计算机中的二进制原理并无关系,仅仅是一种思想上的巧合。
在上图中长实线代表“阳”,用中间断开的线代表“阴”。3种这样的线条组成8种形状,相当于用3位二进制数表示8种状态。
在现代,八进制计数通常采用0—7的阿拉伯数字表示。八进制计数的规则:①基数为8;②由8个数字组成,分别是0、1、2、3、4、5、6、7;③逢8进1,借1当8。
十进制数与其他进制数的转换
上文中将二进制数转换为十进制数的方法“按权展开”,同样适用于将其他进制数转换为十进制数。请看下面这条按权展开公式,学习了数列知识的同学,是不是感觉很亲切呢?
(B表示各进制的基数,n表示位数)
类似地,十六进制计数的规则:①基数为16;②由16个数字(符号)组成,分别是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F;③逢16进1,借1当16。例如同学们可以动手试一试将十六进制数BC0D转换为十进制数:
BC0D(十六进制)
=11×16(4-1)+12×16(3-1)+0×16(2-1)+13×16(1-1)
=48141
此外,我们使用上文中提到的将十进制数转换为二进制数的“除基数B取余,逆序排列”方法,同样可以将十进制数方便地转换为其他进制的数。