计算机与二进制
3177字,阅读需时11分钟

计算机唯一能识别的代码就是二进制代码,我们编写的Java代码要在计算上执行,就需要把Java代码转换为二进制语言(也称为二进制代码),然后计算机才能执行我们编写的Java程序。

28.png

上图是编写Java程序的基本过程,左侧是编写的Java代码,代码被Java编译器编译为字节码文件,也就是Class文件,最后Java虚拟机会加载Class文件,并把Class文件转换为二进制代码。

29.jpg

从图中可以看出,二进制代码就是数字0和1的组合,这些0和1的组合表示什么意思呢?下面我们就来讨论这些0和1的数字。

只有0和1组成的数字称为二进制数。因为二进制数只有两个数字0和1,因此二进制数非常适合描述电路的通与短、开关的打开与关闭。例如,我们可以用二进制数0和1来表示灯泡的亮与不亮,用二进制数0来表示灯泡不亮,用二进制数1来表示灯泡亮,这样我们就可以用多个二进制数来表示灯泡的亮与不亮了。如01011表示有三个灯泡亮,两个灯泡不亮,而且还知道是哪个位置的灯泡没有亮。

30.jpg.png

计算机的电路都是由电子元器件组成的,电子元器件的状态分为通电和不通电。通电的电子元器件会有电压,称为高电位,用二进制数1来表示,不通电的电子元器件没有电压,称为低电位,用二进制数0来表示,这样一组电子元器件的状态就可以用一组二进制数来表示。

31.png

上图使用四个二进制数可以表示四只二极管的组合状态,0101表示有两只二极管是高电位,两只二极管是低电位。低电位的二极管是从左侧开始的第1只和第3只,高电位的二极管是从左侧开始的第2只和第4只。

这些表示电子元器件状态的二进制可以进行最简单的加减运算(再复杂的运算最终都会分解为加减运算),运算后的结果再通过控制电路改变电子元器件的状态。因此计算机内部运算都采用二进制运算,能够识别的数也是二进制数。

32.png

上图有两组二极管,左侧一组二极管的状态是0101,右侧一组二极管的状态是0110,可以对这两组二极管的状态进行相加运算,运算的结果是1011,0101和0110相加为什么结果会是1011呢?二进制数是怎么运算的呢?二进制数和十进制数有什么关系,毕竟我们生活中用的都是十进制数。

要认识二进制数,我们先来做个小游戏。

伸出我们的右手,从小指开始,依次到大拇指分别代表数字1、2、4、8、16,这些数字也称为每个手指的权重,拇指的权重是16,食指的权重为8,中指的权重为4,无名指的权重为2,小指的权重为1。并且每个手指分为两种状态,手指伸直为1状态,手指弯曲为0状态。

33.png

然后分别做每个手指自由伸直或弯曲动作,记录其状态和五个手指的状态与权重乘积的和,状态顺序从大拇指开始。

34.png

例如上图的拇指和食指是伸直状态,中指、无名指和小指是弯曲状态,整个手指的状态是11000,在此状态下,五个手指的状态与权重乘积的和是24。

请同学们练习下图所示的动作,并计算五个手指的状态与权重乘积的和。

35.png

有同学可能会问,做这个游戏的意义是什么呢?这个游戏用直观化的方式演示了二进制数到十进制数的转换,五个手指的伸直和弯曲的状态组合用0和1表述出来,这就是我们本课要学习的二进制数,游戏中记录的数字之和就是二进制数的十进制表示。

前面的游戏可以把5个二进制数转换为十进制数,同样的道理,也可以把30以内的十进制数转换为二进制数。只需要把十进制数分解成16、8、4、2、1任意数字之和就可以,然后将对应数字的右手手指伸直,没有对应数字的右手手指弯曲,从大拇指开始记录其组合状态,该组合状态就是要转换的二进制数。

36.png

可以借助十进制数来理解二进制数。在十进制中,最开始学习的是十以内的加法,之后是两位数的加法,在两位数加法的学习中,就需要逢十进一了,按进位的原则进行记数的方法叫做进位记数制,也称为“数制”或“进制”。

我们平时用的最多的就是十进制,也会用到六十进制。因为时间是六十进制,也就是说逢六十进一,例如60秒进1分,60分进1小时。因此每一种数制的进位都遵循一个规则,那就是——逢n进1。这里的n叫做基数。

二进制数因为只有0和1两个数字,用数学语言来说就是基数为2。依次类推,基数为3的是三进制计数、……、基数为10的就是十进制计数,十进制计数有10个数字,分别是0、1、2、3、4、5、6、7、8、9。

37.png

认识了二进制计数,接下来再说说位权,位权就是数字中每一个数位的权重,例如在前面的游戏中我们设定了每个手指的权重。

38.png

可以借助于十进制计数来理解位权,在十进制计数中,计数单位分别为个位、十位、百位、千位、万位、十万位……,其中个位数表示数值1、十位数表示数值10、百位数表示数值100、千位数表示数值1000、……,每个位数表示的数值叫位权。

39.png

位权通过计算基数的n-1次乘方就可以得到,这里的n是指位数所在数字中的位置。例如,对十进制数1260来说,个位数是1260的第一个数字,因此n为1;十位数是第二个数字,因此n为2;百位数是第三个数字,因此n为3;千位数是第四个数字,因此n为4。

乘方运算是指一个数连续自乘n次,可以称为该数的n次乘方。例如:3个5连续自乘,可以称为3的5次乘方。除0外,任何数的0次乘方都为1。

由此可知,个位数的位权为10的1-1次乘方是1,十位数的位权为10的2-1次乘方是10、百位数的位权为10的3-1次乘方是100、千位数的位权为10的4-1次乘方是1000。

40.png

理解了十进制的位权,再来理解二进制的位权就很容易了。例如,二进制数1100从低位到高位的位权依次是2的0次乘方,结果是1、2的1次乘方,结果是2、2的2次乘方,结果是4、2的3次乘方,结果是8,这也是前面从小指开始到食指指定的位权。

60.png

理解了二进制计数的基数和位权,就可以进行数制转换了。00111如何转换成十进制计数呢?转换很简单,将二进制数从高位到低位每个数字乘以相应的位权然后求和就可以了。

61.png

十进制数转换为二进制数 ,该如何转换呢?

  十进制整数转换为二进制整数采用"除2取余,逆排序"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把所有余数按逆序排列,也就是把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。这就是所谓“除2取余,逆序排列”。

例:将一个十进制数25转换为二进制数。

62.png

了解了二进制数和十进制数的关系,我们再来看看二进制在计算机的具体应用。

虽然我们在计算机屏幕上看到的都是我们熟悉的十进制数,但在计算机存储的是二进制数。当我们用计算机键盘输入十进制数值时,计算机会把十进制数转换成二进制数存储起来,当计算机在屏幕上要显示数值时,会把存储的二进制数再转换成十进制数进行显示。

我们使用最多的字符信息在计算机中也是采用二进制存储的,为了让计算机存储和处理字符信息,人们用编码方式将字符与二进制数一一对应起来,一个字符对应一个二进制数,对应的二进制数也称为字符编码。例如ASCII码就是一种字符编码,它用指定的7 位或8 位二进制数组合来表示128 或256 种可能的字符。

63.png

在上面的ASCII码表中,大写字母A被编码为二进制数0100 0001,对应的十进制数为65,大写字母C被编码为0100 0011,对应的十进制数为67。人们通过键盘输入大写字母A时,计算机将会把字符A转换为0100 0001二进制编码进行存储和处理,当显示器显示字符A时,计算机会根据字符编码找到对应的字符A的点阵图,以图像方式显示字符A。

最初的编程语言是机器语言,也是计算机唯一能直接读懂的语言。计算机只能识别二进制代码,所以机器指令也是由二进制代码组成的,所谓的机器语言,就是直接用二进制来编写计算机的指令序列,计算机的指令是计算机本身提供的操作和命令,这些操作和命令也是用二进制来提供的。                                              


读者留言
最新
推荐
郎宏林
授课老师
授课老师简介
项目经理,系统分析和架构师,从事多年中文信息处理技术。熟悉项目管理、擅长项目需求分析和设计、精通Java、C#、Python等编程语言。