二进制、八进制、十六进制转换及原码、反码、补码转换

二进制、八进制、十六进制转换及原码、反码、补码转换

二进制

  • 如果说十进制是人类的计算度量单位,那么二进制就是机器识别的计算度量单位
    ,十进制逢十进一,例如9+1=10,到10进位,各位数为0,十位数则加1为1,写出来则为10,在计算机中,有个概念叫位,一个byte是8位,我们下面讨论的都将以8位为准,例如1,在计算机中显示为0000 0001,那么计算机中1+1=2,则逢2进1就是0000 0010,在java中如果要定义一个数为二进制数,则可以这样定义int a = 0b111;计算机中规定最高位是符号位正数用0表示,负数则用1表示,那么-1则怎么表示呢,是1000 0001吗?答案是否定的,待会儿讲到原码、反码、补码的时候会提到.

八进制

  • 顾名思义 即逢8进1,同理9表示成 011,java中定义8进制数9则定义成 int a = 011,定义7为 int a = 07

十六进制

  • 即逢16进1,同理9表示成 int a = 0x9,10可以表示成 int a = 0x10或者int a = 0xa,字母a-f分别可以表示数字10-15,因为数字2位可能看起来不是很直观

进制转换

十进制 --> 二进制、十进制 --> 八进制、十进制 --> 十六进制

以5为例

  • 转成二进制则是0000 0101,如何计算的呢,有个公式5/2 = 2,余数为1,2除2=1,余数为0,1/2=0,余数为1,结果按余数倒序101即结果

以10为例

  • 转成八进制则是0000 0012,同理10/8 = 1余数为2,1/8=0 余数为 1,结果按余数倒序12即结果

以20为例

  • 转成十六进制为0000 0014,也可以表示为0xe,同理转成16进制,20/16=1余数为4,1/16=0余数为1,结果按余数倒序14即结果

原码、补码、反码

在讲解之前,先做一个小测试1-1,我们都知道在数学算数中减一个数等于加一个数的负数,而计算机并不能直接做减运算,1-1在计算机中表示为1+(-1),下面是运算过程

0000 0001

+1000 0001

= 1000 0010(-2),
看到这里是不是觉得很奇怪,感觉计算机是出bug了,实则是不对的,因为计算机中对有符号的数运算都是以补码为基础的,接下来我将分别介绍下什么是原码、反码跟补码

  • 原码
    即二进制在计算机中本来的显示方式,无符号数(即正数)最高位为0,有符号数(即负数)最高位为1,例如1的显示为0000 0001,-1的显示为1000 0001

  • 反码
    正数反码等于原码,负数则二进制原码中剔除最高位的符号位,其余的数取反即可,例如-1的原码1000 0001,剔除最高位取反为1111 1110

  • 补码
    正数的补码=原码=反码(即三码合一),负数的补码计算规则首先将负数的绝对值转成二进制,-1为例,转成绝对值1则为0000 0001,然后再将其转成反码为1111 1110,最后+1即1111 1111,这个就是-1的补码,现在来回头计算下之前的1+(-1)问题

    0000 0001

+1111 1111

=1 0000 0000,计算结果超过8位,计算机会主动去丢掉超过的位数,那么最后结果即为0000 0000,这样结果就对啦
好了今天就简单介绍到这里,二进制相关的我会写一篇专栏,下期将会介绍二进制的位运算,希望能帮助到大家一起进步.

你可能感兴趣的:(java,java,se)