2.5、进制
在计算机科学和数学中,进制是用于表示数值的一种方法。计算机的世界中只有二进制,计算机存储和运算的所有数据(数字、字符、图片、声音、视频等),在计算机都是二进制数据。
2.5.1、简介
进制就是当一个数,满足该进制的最大数时,该数前位+1,本位清零。我们最熟悉的就是十进制:9进一位就是10,19进一位就是20。
常用的进制一般有4种:
-
二进制:计算机底层都是二进制,0和1,满二进一,前缀一般为0b。
-
八进制:0-7,满八进一,以数字0为前缀。
-
十进制:我们正常使用的进制为十进制,0~9,满十进一,无前缀为默认进制
-
十六进制:0-9和A-F,满十六进一,以0X或0x为前缀,广泛用于计算机系统,特别是在内存地址和颜色编码中。
十进制 二进制 八进制 十六进制 0 0b0 00 0x0 1 0b1 01 0x1 2 0b10 02 0x2 3 0b11 03 0x3 4 0b100 04 0x4 5 0b101 05 0x5 6 0b110 06 0x6 7 0b111 07 0x7 8 0b1000 010 0x8 9 0b1001 011 0x9 10 0b1010 012 0xA 11 0b1011 013 0xB 12 0b1100 014 0xC 13 0b1101 015 0xD 14 0b1110 016 0xE 15 0b1111 017 0xF 16 0b10000 020 0x10 17 0b10001 021 0x11 18 0b10010 022 0x12 19 0b10010 023 0x13 20 0b10011 024 0x14
在Java也可以使用不同进制表示:
2.5.2、二进制
二进制(Binary)是一种基数为2的数制系统,它只使用两个数字:0 和 1。
目前计算机底层都是二进制形式,因为电路的设计是基于开关两种状态,完美的适配了二进制。
而二进制有三种方式:原码、反码、补码。对于一个正数来说,三个码表示出来都是一样的结果。
-
原码:直接将一个数转换成二进制就是原码,最高位(最左边的位)用作符号位,符号位都是用0表示“正”,用1表示“负”
比如1个byte的变量为1个字节,8个bit,在二进制的形式下13和-13的原码为:
13: 0 0 0 0 1 1 0 1
-13:1 0 0 0 1 1 0 1
-
反码:对原码进行取反操作,但是最高的符号位不变(反码的出现是为了解决原码不能用于计算负数)
正数的反码等于原码,负数的反码是符号位保持不变,其余位取反。
13反码: 0 0 0 0 1 1 0 1
-13反码:1 1 1 1 0 0 1 0
-
补码:正数的补码和原码相同,负数补码就是在反码的基础上加上一个1(补码是为了解决负数计算时跨0的问题,计算机底层存放的就是补码)
13补码: 0 0 0 0 1 1 0 1
-13补码:1 1 1 1 0 0 1 1
在计算机底层二进制的存储中,所有的数值,无论正负,都是以补码的方式存储的。原因在于,使用补码,可以将符号位和数值域统一处理,同时,加法和减法也可以统一处理 。
计算二进制时,要换成补码计算,正数的原码补码相同,负数需要转换。
2.5.3、进制转换
-
十进制转换为其他进制:转换成几进制就对几进行求余
-
转换成2进制:不断除以2并记录余数,直到商为0。余数的逆序即为二进制数。
-
转换成8进制:通过不断除以8并记录余数,直到商为0。余数的逆序即为八进制数。
-
转换成16进制:通过不断除以16并记录余数,直到商为0。余数的逆序即为十六进制数。
-
-
其他进制转换成10进制:使用位置权重法,每一位数乘以其对应的进制权重,然后求和。
-
转换成二进制
-
8进制转换成二进制:每一个八进制的数字可以直接转换为一个3位的二进制数。
-
16进制转换成2进制:每一个十六进制的数字可以直接转换为一个4位的二进制数。
-
-
二进制转换为8进制:从右向左(从低位到高位)将二进制数分成每组3位。如果最左侧的一组(最高位)不足3位,则在左侧补0。然后将每组二进制数转换为相应的八进制数。
-
二进制转换16进制:从右向左(从低位到高位)将二进制数分成每组4位。如果最左侧的一组(最高位)不足4位,则在左侧补0。然后将每组二进制数转换为相应的十六进制数。