进制转换
参考:
https://blog.csdn.net/jjj19891128/article/details/22945441(得到小数转换二进制)
引:
最常见的数字进制是十进制,我们生活当中均有体现,如15.00 ¥ ,以0-9组成的数字序列
再其次了解的进制是2进制,是计算技术中广泛采用的一种数制, 如: 0b0100,以0-1组成的数字序列,前面以0b或者0B开头,用来与10进制区分
再其次熟悉的进制是16进制,偶尔可以看到类似:C554D0513BBE7D39,这是我利用md5加密后得到的16位表示字符串,计算机应用中经常用它存储密吗这类东西,16进制以0X开头,后面由0-9 a-f A-F组成的数字序列,如0X5A
再常见的就是8进制了,0开头,0~7范围内数字组成的数字序列,如:0342
二进制的产生是因为早期的电子元件只能表达开关的这两种状态;八进制在对变量进行移位操作等比较底层的程序设计是很有用的并且8进制是用于ACSIC码的;十六进制作为计算机领域一种重要的数制,对计算机理论的描述,计算机硬件电路的设计都是很有益的。比如逻辑电路设计中,即要考虑功能的完备,好要考虑用尽可能少的硬件,十六进制就能起到一些理论分析的作用。比如四位二进制电路,最多就是十六种状态,也就是一种十六进制形式,只有这十六种状态都被用上了或者尽可能多的被用上,硬件资源才发挥了尽可能大的作用。
引:https://blog.csdn.net/weixin_38701432/article/details/79474277
什么是进制呢?
进制转换:进制转换:
0100100 2进制转十进制: 0*2^0 + 0*2^1 + 1*2^2 + 0*2^3 + 0*2^4 + 1*2^5 = 4 + 32 = 36 2进制转8进制: 000(8^2)+ 100(8^1) + 100 (8^0) = 0 * 64 + 4*8 + 4*1 = 36 = 044 8进制以0开头,原理利用2^3=8 2进制转16进制: 0010(16^1) + 0100(16^0) = 2*16 + 4 = 36 = 0x24 原理利用2^4=16 16进制转2进制: 0x24 0010 0100 将每个数字分别转2进制即可,4位表示 8进制转2进制: 044 100 100 将每个数字分别转2进制即可,3位表示 10进制转2进制:36 2 36 0 2 13 1 2 6 0 2 3 0 2 1 1
2 0 1
10进制数依次除以2,直到商为0,从下往上将所有余数相粘合, 得到:110010
如果有正负号,正负号保留, 如果有小数点,小数点也保留(这一句话怎么说呢?可以说有歧义也可以说没有,此文章后面补充出去)
小数点后的转二进制与整数转二进制有些不同,因为要把数转换成2^n + 2^m + 2^b ...累加的形式,而2^0就是1,所以n这些一定是负整数, 2^-1 = 1/2.... ,转二进制的方式就是 不断 * 2, 得到值<1计为0,>1计为1,大于1后应使用该值-1进行后面的计算,最后转换成为1.xx * 2 ^n次方的形式 0.25转二进制 0.25 * 2 0.5 0 0.5 * 2 1.0 1 0 * 2 0 0 ... 得到0.010,得到1.0 * 2^-2
5.2转2进制
整数部分转二进制与小数部分转二进制相粘合
5转2进制:101
0.2的二进制:0011001100110011001100110011 无限循环
粘合: 101. 00110011 00110011 00110
计数法表示:1.010011001100110011 * 2^2
其他进制转换可以以2进制为媒介中转,数额太大可使用计算器或者api达到效果
自己思考并且验证过的朋友可以发现,我们使用java程序输出数据的二进制形式,写个demo进行验证:
public class TestByte {
public static void main(String[] args) {
System.out.println(Integer.toBinaryString(13));
System.err.println(Long.toBinaryString(Double.doubleToLongBits(13.2)));
System.out.println(Integer.toBinaryString(-13));
}
}
输出结果为:
发现输出的与我们所写的不太一致。
原因有如下几个:
1、程序输出的二进制是数据的二进制存储结构,也就是补码形式
2、java程序输出的二进制形式默认舍去了前面的0
3、浮点数的存储和整数的存储不同,存储大致是 符号位 + 偏移指数 + 分数构成而不是我们运算的整数 + . + 小数构成。