1.进制基础知识
常见进制的数据组成:
二进制:由0,1组成。在Java中以0b开头
八进制:由01234567组成。在Java中以0开头
十进制:由123456789组成。整数默认是十进制的
十六进制:由123456789ABCDEF(大小写均可)。在Java中以0x开头
1.1 进制转换
1.1.1 R进制到十进制的转换
规则:按权展开法(系数*基数的权次幂 相加)
● 系数:每一【位】上的数
● 基数:R进制,基数就是R
● 权:从数值的右侧,以0开始编号,对应位上的编号就是该位上的权
● 举例:0b101010
0b101010 = 1*2^5 + 0*2^4 + 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 42
● 练习:计算下列数据对应的十进制的值
052,0x2A
5*8^1 + 2*8^0 = 42
2*16^1 + 10*16^0 = 42
1.1.2 十进制到R进制的转换
规则:重复相除法(除基取余,直到商为0,余数反转)
● 把42转换为二进制
● 42 = 0b101010
● 练习:计算42数据对应的八进制和十六进制的值
052
0x2A
如何实现二进制和十进制之间的快速转换呢?
采用8421码就可以实现
8421码:
是BCD代码中最常用的一种
BCD:(Binary-Coded Decimal)二进制码十进制数,在这种编码方式中,每一位二进制值代码的1都是代表一个固定数值,把每一位的1代表的十进制数加起来得到的结果就是它所代表的十进制数码
二进制到八进制如何转换呢?
思路1:把二进制转换为十进制,然后再把该十进制转换为八进制
思路2:三位组合法
把二进制的数据,从右开始,每3位一组合,最左边不够的时候,补0
然后,分别计算对应的十进制数值
最后,从左往右,把每个十进制的数据组合起来,就是一个八进制数据
二进制:0b101010
拆分: 101 010
计算: 5 2
组合: 52
八进制:052
从八进制到二进制只需要把每一位都换成3位的二进制就可以了
二进制到十六进制如何转换呢?
四位组合法:
把二进制的数据,从右开始,每4位一组合,最左边不够的时候,补0
然后,分别计算对应的十进制数值
最后,从左往右,把每个十进制的数据组合起来,就是一个十六进制数据
同八进制与二进制的关系异曲同工
2.Java内置的进制转换:
java.lang.Integer类中的静态方法:
public static String toBinaryString(int i):在基数2中返回整数参数的字符串表示形式为无符号整数
public static String toOctalString(int i):在基数8中返回整数参数的字符串表示形式为无符号整数
public static String toHexString(int i):返回整数参数的字符串表示形式,作为16位中的无符号整数
public static String toString(int i,int radix):返回由第二个参数指定的基数中的第一个参数的字符串表示形式
3.有符号数据表示法
原码、反码、补码
4.整数强制转换之数据溢出
byte b = 130;
在编译器中会显示编译失败,因为130是int类型的
所以我们加一个强制类型转换
byte b = (byte)130;
输出b会发现输出的是-126
下面我们对此做出分析:
int占4个字节,130用原码表示为:00000000 00000000 00000000 10000010
由于是正数,所以补码与原码相同
接下来强转位byte类型,即截取8位
补码:10000010
先转为反码:10000001
再转为原码:11111110 ->最高位是符号位->-126
5.浮点数存储
二进制浮点数转换为十进制浮点数
规则:按权展开法(系数*基数的权次幂相加)
● 系数:每一【位】上的数
● 基数:R进制,基数就是R
● 权:
整数部分:从小数点左侧,以0开始编号,对应位上的编号就是该位上的权
小数部分:从小数点右侧,以-1开始编号,对应位上的编号就是该位上的权
● 举例:把二进制浮点数110.101转换为十进制浮点数
110.101 = 1*2^2 + 1*2^1 + 0*2^0 + 1*2^-1 + 0*2^-2 + 1*2^-3 = 6.625
十进制浮点数转换为二进制浮点数
规则:整数部分重复相除法,小数部分重复相乘法
● 整数部分重复相除法:除基取余,直到商位0,余数反转
● 小数部分重复相乘法:乘基取整,知道小数位0或者达到指定精度位,整数顺序排列
● 举例:把十进制浮点数6.625转换为二进制浮点数
整数部分:110
小数部分:
0.625 * 2 = 1.25 取整:1 ↓
0.25 * 2 = 0.5 取整:0 ↓
0.5 * 2 = 1 取整:1 ↓
小数部分:101
练习:
● 把二进制浮点数1010.0101转换为十进制浮点数
1*2^3 + 1*2^1 + 1*2^-2 + 1*2^-4 = 10.3125
● 把十进制浮点数10.3125转换为二进制浮点数
1010.0101