前言上一篇易哥给大家讲了Java中的各种运算符。其中,在解释位运算符时,提到了计算机中基数的概念。但是现在很多小白同学对基制的概念理解不够,比如二进制,八进制,十六进制,这是怎么回事?有什么特点?碱基之间如何转换?原码、反码、补码分别是什么意思?……这些问题依然困扰着不少童鞋。那么今天易哥就用另外一篇文章给大家讲解一下计算机中与二进制有关的内容,尤其是二进制。你需要仔细阅读它。------------------------------前戏结束,欢乐开始--------------------------全文约[3600]字,废话不多说,纯干货,让你学技术,懂原理!本文包含丰富的案例和图片,让您更好地理解和使用文章中的技术概念,并能给您带来足够的启发性思考……一、十六进制1、概念首先,我们要知道十六进制的概念。所谓基数系统也叫进位计数系统,是一种人为定义的带有进位的计数方式。当然也有不带进位的计数法,比如原来的结点计数法、投票常用的“正”字计数法等。在任何一种基制中,每个数字上的数字都是全X进位一位数在操作过程中。例如十进制是十进制一位,十六进制是十六进制一位,二进制是两位一位,以此类推,X基制是X位一位。以我们最熟悉的十进制为例,每次小数为1,当数为19时,下一位的尾数满足基数的最大数,所以下一位的尾数被清零,首位为+1,则为20。2.分类在计算机中,常用的基数有:●十进制;●二进制;●八进制;●十六进制由于计算机底层只能处理二进制格式的数据,即0和1,其他的文字、数字、字符等信息必须转换成二进制格式,计算机底层才能识别和识别。处理它们。所以作为程序员,二进制是我们必须要了解和掌握的。3.二进制作为程序员,必须掌握的基础系统是二进制。事实上,我们只需要参考十进制就可以很容易地理解基本系统。所谓二进制,里面只有0和1,而且全是二进制对一,所以二进制里看不到>=2的数。比如二进制的前10位是0,1,10,11,100,101,110,111,1000,1001。4.八进制八进制有0到7这8个数,但是没有8。规则是全八进制的,所以7的下一位不是8,而是10。17的下一位不是18,而是20。例如八进制的前10位是0、1、2、3、4、5、6、7、10、11...5,而十六进制的16位数字中有0~F,也没有16,则规则是完整的十六进制。在十六进制中,这16个数分别是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。也就是说9的下一位是不是10,而是A。数字10只是十进制的派生词。大家要注意这一点!同样,在十六进制中,19的下一位不是20,而是1A,1F的下一位是20;99的下一位是9A,FF的下一位是100。6.原码、反码和补码6.1原码对于一个正整数,所谓原码是指一个整数对应的二进制。比如整数10的原码是00001010,那么原码就是一个正整数的原始二进制形式。但是负数的原码和正数是不一样的。负数原码需要将正数原码的符号位(最高位)改成1,例如-10的原码为10001010。6.2正数的反码为Its原码,即一个正数的原码和反码完全相同。负数的反码就是将原码中除符号位外的所有位(取值位)取反,即0变成1,1变成0。比如10的原码和反码都是00001010,-10的原码为10001010,反码为11110101。6.3正数的补码为其原码,故原码、反码、补码均相同。一个负数的补码是它的反码加1,-10的原码是10001010,它的反码是11110101,它的补码是11110110。我们可以认为补码是在反码的基础上打补丁,一个稍加修正,故称“补码”。因此,原码、反码、补码的概念只对负数有实际意义。对于正数来说,原码、反码、补码其实是一样的,如下图:了解了这些基数的概念之后,易哥给大家讲解最重要的基数转换问题,拿出小本子做记录,重点来了。二、十六进制的转换1、十进制与二进制的转换(掌握)首先我们来学习十进制与二进制的转换,这是必须要掌握的。1.1十转二如果要将十进制转为二进制,可以采用滚动法,将十进制除以2取余,然后从下到上倒序写余数和最后一位。比如我们要把十进制的302转换成对应的二进制,过程如下:302?2=151,0151?2=75,175?2=37,137?2=18,118?2=9,09?2=4I14?2=2I02?2=1I01?2=0I1我们把上面每一步得到的余数和最后的1从下往上倒序写上,所以二进制302对应的数是100101110。1.2二转十如果要将二进制转十进制,有两种计算方法。第一种计算方法是从最高位(最左边的“1”)开始,从上到下依次写出。首先从第1位开始计算0*2。如果每一位对应的余数为1,则乘以“2”后加“1”,否则加0。再将上次计算得到的结果乘以2,最后加1或0,以此类推。易哥用下面的例子来演示一下:例如:1001011101…………0??2+1=1…………余数是10…………1??2+0=2…………余数是00…………2??2+0=4…………余数为01…………4??2+1=9………………余数为10…………9??2+0=18………………余数为01…………18??2+1=37…………余数为11………………37??2+1=75…………余数为11………………75??2+1=151…………余数为10……………………151??2+0=302………………余数0通过这样计算,我们可以先得到最终的十进制数302第一种计算方式其实是一个有点复杂,我们可以使用更简单的第二种计算方法。方法是从最低位开始,每一位上的数的N次方*2,N从0开始计数(0,1,2...),每一位的乘积累加到最后的结果。如果我们把上面的例子换成这个方法计算的话,就是:12^8+02^7+02^6+12^5+02^4+12^3+12^2+12^1+0*2^0=302其实按照第二种计算方法,就可以找到规律了。最低位计算的十进制结果最大值为1,前一位的最大值为2,依此类推,4,8,16,32,64,128,256.....所以如果binarybit上面是1,在这个位置可以得到对应的十进制最大值,否则只能得到0。比如11111111换算成对应的十进制,可以直接计算:1+2+4+8+16+32+64+128=255。易哥个人比较推荐这种计算方法,简单快捷。基本上我们熟悉之后就可以使用了。可以直接计算结果。2、二进制与八进制的转换(理解)2.1八进制转二如果要把八进制转换成对应的二进制,可以先把八进制中的每一位分开,然后把每一位转换成3位的二进制格式。例如八进制的764转换为对应的二进制111110100,过程如下图所示:2.2二转八如果要将二进制转换为对应的八进制,可以将当前的三位数按(421)恢复为对应的1位八进制。比如我们将二进制1100101011转换成对应的八进制1453,过程如下图所示:3.二进制与十六进制的转换(理解)3.1十六进制转2如果要将十六进制转成对应的二进制,可以先将十六进制中的每一位分开,然后将每一位转换成4位(8421)二进制格式。例如将十六进制的a8f5转换成对应的二进制1010100011110101,过程如下图所示:3.2二转十六。数字分开,将当前四位按照(8421)的方式恢复为对应的1位十六进制。比如我们把二进制11101000101010转换成对应的十六进制3a2a,过程如下图所示:4.负二进制(理解)不仅正数可以有对应的二进制,负数也可以有对应的二进制.在计算机中,任何数据都以二进制补码的形式存储。正数的原码、补码、反码都是完全一样的。但负数的原码、反码、补码是不同的:负数原码=将正数原码的符号位(最高位)改为1;负数的反码=符号位不变,其他位取反;负数的补码=负数的补码+1。易哥在之前的文章中说过,在计算机中,最高位代表符号位,0代表正数,1代表负数。下面易哥就以-24和-68为例,给大家讲讲负数的二进制转换。4.1负数转二进制根据前面的内容,我们可以计算出正数24的原码为00011000(反码和补码同理)。于是-24对应的原码就出来了,我们只是把00011000的最高位改成1,即-24的原码为10011000。所以-24的反码也出来了,最高位保留不变,其他位全部取反,反码为11100111。-24的补码是反码+1,所以-24的补码=11101000。如下图所示:4.2二进制转负数既然我们可以将负数转换成对应的二进制数,那么逆运算当然是也可以。如果我们现在有一个二进制,补码是10111100(高位是I代表负数),我们需要按照负数转二进制的逆运算来操作。先计算补码对应的补码,补码=补码-1,即补码=10111100-1=10111011。再根据反码计算原码,原码=符号位不变,其他位取反=11000100。所以最终对应的十进制数为-68。5.小数的二进制(理解)另外,还可以实现小数与二进制的转换。5.1十进制转二进制12.020.02*2=0.04如果要将十进制转为对应的二进制,整数和小数是分开计算的。如果有整数,则将整数转换为对应的二进制。小数部分的计算比较麻烦。主要是小数部分乘以2,整数部分从左到右放在小数点后,直到小数点后为0。例如,小数0.125的具体换算过程如下:1、小数部分0.125乘以2得0.25,取整数部分0记录;2小数部分0.25乘以2得到0.5,再取整数部分0记录;小数部分0.5乘以2得到整数1.0,再取整数部分1记录。因为1.0的小数点为零,所以乘以2的循环结束。最终得到0.125对应的二进制结果0.001,如下图所示:5.2二进制转十进制如果要将二进制转为对应的十进制,可以从小数点开始,将当前位上的数乘以2-1的-N次方,然后累加。比如我们要把0.0101转换成对应的小数,就是02-1+12-2+02-3+12-4=0.3125。如果您无法计算,请使用计算器。----------------------------正片结束,抽完烟吧-------------------------3.结语至此,易哥已经把电脑中的基本问题给大家解释清楚了。你现在掌握基础转换了吗?其实今天的内容与Java无关。所有学习编程开发或计算机技术的知识都应该有基础。所以学习了今天的内容,对于我们加深对计算机底层的理解也是很有帮助的。4、今天作业第一题,将十进制的520转为二进制,在评论区给出你的答案,看看你对易哥的爱有多深。hiahia第二题,将00110101转换成对应的小数。在评论区给出你的答案。
