Logo

郎哥编程

计算机与二进制

2018-06-23 2521

课程导言

最早的编程语言是二进制语言,也是计算机能够直接识别的唯一语言。不管用什么高级语言编写的程序最后都要转换为二进制语言,才能在计算机上执行,因此掌握二进制知识对学习编程语言是非常有帮助的。】


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

01.png

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

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

02.png

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

03.png

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

04.png

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

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

05.png


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

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

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

06.png

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

07.png

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

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

08.png

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

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

09.png


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

10.png

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

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

11.png

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

12.png

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

13.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。

14.png

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

15.png

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

16.png

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

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

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

18.png

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

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

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

17.png

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

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


课程小结

因为二进制数只有数字0和1,二进制数的这个特点正好用于表示电子元器件的状态,而计算机是由成千上万个电子元器件构成的,所以计算机内部运算都采用二进制运算,能够识别的数也是二进制数,人们从键盘输入的字符或数值都会转换为二进制数存储到计算机内部。


课后练习

将下列二进制数转换为十进制数:

(1)1011

(2)0001

(3)10101

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
老鱼 2020-02-11 22:30

老师好,请你再举例讲一下十进制转二进制。谢谢。

郎宏林 2020-02-11 23:10

<p>二进制数只有0和1两个数字,用数学语言来说就是基数为2。依次类推,基数为3的是三进制计数、……、基数为10的就是十进制计数,十进制计数有10个数字,分别是0、1、2、3、4、5、6、7、8、9。</p><p>可以借助于十进制计数来理解二进制的位权,在十进制计数中,计数单位分别为个位、十位、百位、千位、万位、十万位……,其中个位数表示数值1、十位数表示数值10、百位数表示数值100、千位数表示数值1000、……,每个位数表示的数值叫位权。位权通过计算基数的n-1次幂就可以得到,这里的n是指位数所在数字中的位置,例如,对十进制数1260来说,个位数是1260的第一个数字,因此n为1;十位数是第二个数字,因此n为2;百位数是第三个数字,因此n为3;千位数是第四个数字,因此n为4。由此,个位数的位权为10的1-1次幂是1,十位数的位权为10的2-1次幂是10、百位数的位权为10的3-1次幂是100、千位数的位权为10的4-1次幂是1000。</p><p>理解了十进制的位权,再来理解二进制的位权就很容易了。前面二进制数00111从低位到高位的位权依次是2的0次幂1、2的1次幂2、2的2次幂4、2的3次幂8、2的4次幂16,这也是前面从小指开始到拇指指定的位权。</p><p>理解了二进制计数的基数和位权,就可以进行数制转换了。00111如何转换成十进制计数呢?转换很简单,将二进制数从高位到低位每个数字乘以相应的位权然后求和就可以了。</p><p>00111(二进制)= 0 * 16 + 0 * 8 + 1 * 4 + 1 * 2 + 1 * 1 = 7(十进制)</p><p><br/></p>

星海 2020-02-01 14:59

老师,我初二,数学才90,我这种情况适合学编程吗?

郎宏林 2020-02-02 13:48

<p>你好,初二的知识水平,可以学习编程,学习编程也有助于对数学知识的掌握。关键是要对编程感兴趣,愿意学才行。</p>

z, 2019-11-07 20:26

老师,十进制转换十六进制转换没有想通,请具体举个转换例子,拜托了

郎宏林 2019-11-07 22:07

<p>十进制转换十六进制,同十进制转换二进制原理是相同的,采用“除16取余,逆排序”的方法。</p><p>例如,将十进制数1610转换为十六进制。如下图。<br/></p><p><img src="/Member/net/upload/image/20191107/6370876120758421412091380.png" title="image.png" alt="image.png"/></p><p>1610(10进制)= 64A(十六进制)</p><p><br/></p>

诗酒纵年华 2019-10-28 01:19

2. (1)111110001 1F1H (2)110111000100000 6e20h (3)1100000000111 1807h 3. (1)11111010 250d (2)1011100 92d (3)1111001000110100 62004d

郎宏林 2019-10-28 08:21

<p>转换为二进制</p><p>(1)369——》101110001</p><p>(2)10000——》10011100010000</p><p>(3)4095——》111111111111</p><p>转换为十六进制</p><p>(1)369——》171</p><p>(2)10000——》2710</p><p>(3)4095——》fff</p><p><br/></p>

15930013459 2019-09-16 11:03

1.(1)25d 15h (2)128d 80h (3)255d FFh

大地保险曾凌翔15526050688 2019-11-03 09:57

老师10101转换成15H,重新解析一下,谢谢

郎宏林 2019-09-16 11:16

<p>关于练习题1:</p><p>1、二进制数10101</p><p>(1)转换为10进制</p><p>10101B</p><p>= 1X2^4+1X2^2+1X2^0</p><p>= 16+4+1</p><p>=21D</p><p>(2)16进制转换正确。</p><p>2、二进制数10000000</p><p>10进制和16进制均转换正确。</p><p>3、二进制数11111111</p><p>10进制和16进制均转换正确。</p><p><br/></p><p><br/></p>

得闲饮茶 2019-09-04 02:26

老师,小游戏的第二种法案00111 数字和不是7

郎宏林 2019-09-04 08:36

<p>可以重新算一算:<br/></p><p>动作:伸直小指、无名指和中指,弯曲大拇指和食指。</p><p>动作说明:</p><p>(1)伸直为1,弯曲为0,顺序从大拇指开始;</p><p>(2)大拇指表示数字16,食指表示数字8,中指表示数字4,无名指表示数字2,小指表示数字1</p><p>状态为:00111</p><p>状态的最左侧是大拇指,依次是食指、中指、无名指、小指,状态为0的不计数</p><p>状态计数之和为:</p><p>00111 = 4+2+1 = 7&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</p><p><br/></p>

黄先良 2019-08-31 19:22

老师思考题能给出答案吗?

郎宏林 2019-08-31 19:47

<p>本来是不准备提供参考答案的,既然有不少同学要求,我将以试卷方式给出参考答案,争取这两天给出。</p>

!! 2019-08-23 11:47

老师您好,练习题有答案吗

郎宏林 2019-08-23 13:39

<p>你好,暂时没有提供答案。你可以把答案放到留言区,我会及时回复</p>