前言在上一篇文章中,壹哥给大家讲了 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、十六进制
十六进制中有 0~F 共 16 个数字,同样没有 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 反码负数的反码就是其原码,即负数的原码和反码完全相同。而正数的反码则是将原码中除符号位以外的所有位 (数值位) 都取反,即 0 变成 1,1 变成 0。如 10 的原码和反码都是 00001010,而 -10 的原码是 10001010,反码则是 11110101。
6.3 补码负数的补码就是其原码,所以负数的原码、反码、补码都雷同。而正数的补码是其反码加 1,-10 的原码是 10001010,反码则是 11110101,补码则是 11110110。咱们能够认为,补码是在反码的根底上打了一个补丁,进行了一点修改,所以叫做“补码”。
所以原码、反码、补码的概念只对正数有实际意义,对于负数来说,原码、反码、补码其实都是一样的,如下图所示:
理解完这些进制的概念之后,接下来壹哥就给大家解说最重要的进制转换问题,拿出小本本做好记录哦,重点来啦。
二、进制转换
1、十进制和二进制的转换(把握)
首先咱们来学习十进制与二进制之间的转换,这是必须要把握的哦。
1.1 十转二
如果咱们想将十进制转为二进制,能够采纳辗转法,将十进制除以 2 再取余,而后将余数和最初的 1 依照从下向上倒序写的办法。例如咱们想将十进制的 302 转为对应的二进制,过程如下:
302➗2 = 151 余 0
151➗2 = 75 余 1
75➗2 = 37 余 1
37➗2 = 18 余 1
18➗2 = 9 余 0
9➗2 = 4 余 1
4➗2 = 2 余 0
2➗2 = 1 余 0
1➗2=0 余 1
咱们将下面每一步失去的余数和最初的 1,依照从下向上倒序的形式进行编写,所以 302 对应的二进制数为 100101110。
1.2 二转十
如果咱们要把二进制转为十进制,有两种计算方法。
第一种计算方法,是把二进制从最高位 (最右边的“1”) 开始,先依照从上到下的程序写进去。先从第 1 位开始计算 0 *2,如果每一位上对应的余数是 1,在乘以”2“之后还要再加”1“,否则就加 0。接着用上一次计算失去的后果乘以 2,前面再加 1 或者是 0,以此类推。壹哥给大家用上面的例子进行演示:
例如:100101110
1…………0✖️2+1=1…………余数为 1
0…………1✖️2+0=2………… 余数为 0
0 …………2✖️2+0=4 ………… 余数为 0
1 …………4✖️2+1=9……………… 余数为 1
0…………9✖️2+0=18 ……………… 余数为 0
1 …………18✖️2+1=37 …………余数为 1
1…………… 37✖️2+1=75…………余数为 1
1………………75✖️2+1=151………… 余数为 1
0………………151✖️2+0=302 ………… 余 0
通过这样的计算,咱们就能够失去最终的十进制数 302
第一种计算形式其实有点简单,咱们能够采纳更简略的第二种计算方法。该办法是从最低位开始,每位上的数字 * 2 的 N 次幂,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
其实依据第 2 种计算方法,你能够发现法则。最低位上计算出来的十进制后果最大值就是 1,往前一位的最大值是 2,以此类推,4、8、16、32、64、128、256…..
所以如果该二进制位上是 1,该地位上必定能够失去对应的十进制最大值,否则只能失去 0。比方 11111111 转成对应的十进制,就能够间接计算:
1+2+4+8+16+32+64+128=255
壹哥集体举荐采纳这种形式进行计算,简略快捷,基本上咱们相熟之后就能够间接口算出后果。
2、二进制和八进制的转换(理解)
2.1 八转二
如果你想将八进制转为对应的二进制,能够先将八进制里的每一位一隔,而后别离将每一位换算成 3 位二进制的格局。比方八进制的 764 转成对应的二进制 111110100,过程如下图所示:
2.2 二转八
如果你想将二进制转为对应的八进制,能够从低位到高位,每三位一隔,将以后三位依照 (4 2 1) 的形式还原成对应的 1 位八进制。比方咱们将二进制的 1100101011 转成对应的八进制 1453,过程如下图所示:
3、二进制和十六进制的转换(理解)
3.1 十六转二
如果你想将十六进制转为对应的二进制,能够先将十六进制里的每一位一隔,而后别离将每一位换算成 4 位 (8 4 2 1) 二进制的格局。比方十六进制的 a8f5 转成对应的二进制 1010 1000 1111 0101,过程如下图所示:
3.2 二转十六
如果你想将二进制转为对应的十六进制,能够从低位到高位,每四位一隔,将以后四位依照 (8 4 2 1) 的形式还原成对应的 1 位十六进制。比方咱们将二进制的 11 1010 0010 1010 转成对应的十六进制 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.02 0.02*2=0.04
如果咱们想将小数转为对应的二进制,整数和小数是离开计算的。如果有整数,则把整数独自转为对应的二进制。小数局部的计算则绝对麻烦,次要是小数局部乘以 2,取整数局部顺次从左往右放在小数点后,直至小数点后为 0。例如小数 0.125 的具体转换过程如下:
1 将小数局部 0.125 乘以 2,得 0.25,取整数局部 0 记录下来;
2 再将小数 0.25 乘以 2,得 0.5,再取整数局部 0 记录下来;
3 再将小数局部 0.5 乘以 2,失去整数 1.0,再取整数局部 1 记录下来。
因为 1.0 的小数点后为零,完结乘 2 的循环过程。最终咱们失去 0.125 对应的二进制后果 0.001,如下图所示:
5.2 二进制转小数
如果咱们想将二进制转为对应的小数,能够从小数点当前开始,顺次将以后位数上的数字乘以 2 的 - 1 到 - N 次方,再累加。比方咱们想将 0.0101 转为对应的小数,则是 0 2-1+12-2+02-3+12-4=0.3125。如果你口算不进去后果,能够用计算器哦。
—————————— 正片已完结,来根预先烟 ————————–
三、结语
至此,壹哥就把计算机中的进制问题给大家解说结束了。当初你对进制转换都把握了吗?其实明天的内容,与 Java 没有太大关系,所有对于编程开发或计算机技术相干的学习,都应该有进制的根底。所以学习完明天的内容之后,对咱们加深了解计算机的底层也是很有帮忙的哦。
四、今日作业
第一题
将十进制的 520 转为二进制,并在评论区给出你的答案,看看你对壹哥的爱有多深,hiahia
第二题
将 00110101 转为对应的十进制,在评论区给出你的答案。