Java基础:进制转换

Java基础:进制转换

1. 进制的简介

进制也就是进位计数制,是人为定义的带进位的计数方法(有不带进位的计数方法,比如原始的结绳计数法,唱票时常用的“正”字计数法,以及类似的tally mark计数)。 对于任何一种进制—X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

2. 进制的分类

在程序中,常用的进制可以分为以下几种:

二进制: 以数字0-1来表示每一个自然数,逢2进1。

八进制: 以数字0-7来表示每一个自然数,逢8进1。

十进制: 以数字0-9来表示每一个自然数,逢10进1。

十六进制: 以数字0-9,a-f来表示每一个自然数,逢16进1。

二进制: 0, 1, 10, 11, 100, 101, 110, 111, 1000, …

八进制: 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, …

十进制: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, …

十六进制: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, 10, 11, …

3. 进制的表示

同一个自然数,用不同的进制表示的话,结果可能是不一样的。例如,数字10,如果是二进制,表示数字2; 如果是八进制,表示数字8;如果是十进制,表示数字10;如果是十六进制,表示数字16。 因此,不同的进制,需要有不同的标识,来区分不同的进制。

二进制:0b 作为开头,表示一个二进制的数字,例如: 0b10、0b1001…

八进制:0 作为开头,表示一个八进制的数字,例如:010、027…

十进制: 没有以任何其他的内容作为开头,表示一个十进制的数字,例如: 123、29…

十六进制:0x 作为开头,表示一个十六进制的数字,例如:0x1001、0x8FC3…

4. 进制的转换
  • 十进制转其他进制

辗转相除法: 用数字除进制,再用商除进制,一直到商为零结束,最后将每一步得到的余数倒着连接起来,就是这个数字的指定的进制表示形式。

在这里插入图片描述

18 = 0b10010 = 022 = 0x12

  • 其他进制转十进制

每一位的数字乘进制的位数-1次方,再将所有的结果累加到一起。

0b10010 = 1 x 24 + 1 x 21 = 16 + 2 = 18

022 = 2 x 81 + 2 x 80 = 16 + 2 = 18

0x12 = 1 x 161 + 2 x 160 = 16 + 2 = 18

  • 二进制与八进制的相互转换
每一个八进制位可以等价替换成三个二进制位。
注意:
1.划分从右到左进行,如果二进制数的左边不够三位,直接在高位补零凑齐三位
2.当八进制数转成二进制数时,将上述过程反转,有一点要记住,每一个八进制的数必须对应三位二进制位,如果八进制数在转化时得到的二进制数不够三位,直接在最左边用零补齐.
3.每一个十六进制位可以等价替换成四个二进制位。跟二进制与八进制的转化规则类似

在这里插入图片描述

5. 原反补
5.1. 数据的转换

在计算机中, 所有的数据存储都是以二进制的形式存储的。 文字、图片、视频… , 在计算机中都是二进制。 那么, 在计算机的存储系统中, 每一个文件都有大小。 那么文件的大小是如何计算的?

每一个二进制位称为一个 比特位(bit)

8个比特位称为一个字节(byte)

因为:位能表示的数太小了,所以习惯上我们将字节作为计算机存储的最小单位

从字节开始, 每1024个单位向上增1。

8bit = 1byte

1024byte = 1kb

1024kb = 1mb

1024mb = 1GB

1024Gb = 1Tb

1024Tb = 1Pb

1024Pb = 1Eb

1024Eb = 1Zb

5.2. 负数的表示

在使用二进制表示数字的时候,通常会写满1个字节,如果1个字节表示不了,使用2个字节。如果2个字节表示不了,使用4个字节。以此类推,8个字节、16个字节、32个字节…

在使用二进制表示数字的时候,最高位(最左侧的位)不是用来表示数字的大小的,而是用来表示数字的正负的。0代表正数,1代表负数。因此,最高位又被称为符号位

0b0000 1000 所表示的数字是 8
0b1000 1000 所表示的数字是 -8

5.3. 补码的引入
  • 符号位参与运算的问题

在数据的运算中, 由于有符号位的存在。 符号位直接参与运算, 会导致计算的结果出问题。

例子:

8+6

00001000+00000110=00001110=14

例如, 在计算 8 + (-8) 的时候, 如果直接使用二进制表示形式进行运算的时候:

0000 1000 + 1000 1000 = 1001 0000

得到结果 -16

原因就是因为符号位参与了运算, 导致计算的结果出了问题。

  • 原反补

为了规避在计算过程中, 符号位的参与运算, 导致计算结果出错。 人们引入了补码, 规避了这个问题。 在计算机中, 所有的数据存储和运算, 都是以 补码 的形式进行的。

  1. 原码: 一个数字的二进制表示形式, 前面的计算二进制表示形式, 得到的就是原码。

  2. 反码: 正数的反码与原码相同; 负数的反码是原码符号位不变, 其他位按位取反。

  3. 补码: 正数的补码与原码相同; 负数的补码是反码 + 1 。

8, 因为是正数, 原反补都是 0000 1000

-8[原] = 1000 1000

-8[反] = 1111 0111

-8[补] = 1111 1000

  • 补码运算

在计算机中, 所有的数据存储和运算, 都是以 补码 的形式进行的。 因此, 在进行数据运算的时候, 将数据计算出补码, 再进行运算。

8 + (-8) = 0

0000 1000 + 1111 1000 = 1 0000 0000

在上述的计算结果中, 出现了多出一位的情况, 这种情况, 称为 溢出 。 如果出现了溢出的情况, 溢出位直接舍去不要, 即最后的计算结果是 0000 0000, 结果是 0

8 + (-16) = -8

0000 1000 + 1111 0000 = 1111 1000

注意: 补码与补码的计算结果,还是补码。 所以, 我们需要将这个结果再转成原码。

补码求原码的过程: 再对这个补码求补即可。 得出结果: 1000 1000, 结果是 -8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值