整数
正整数
实例
十进制 | 2的次幂 | 二进制 |
---|---|---|
1 | 20 | 0001 |
2 | 21 | 0010 |
3 | 21 + 20 | 0011 |
4 | 22 | 0100 |
5 | 22 + 20 | 0101 |
6 | 22 + 21 | 0110 |
7 | 22 + 21 + 20 | 0111 |
8 | 23 | 1000 |
… | … | … |
分析
比如:100转成二进制
1, 转成2的次幂:100 = 26 +25+22
2,0000 0000 根据 26中的6,再+1 即7,从左至右的第7位改为1: 0100 0000
3,0100 0000 根据 25中的5,再+1 即6,从左至右的第6位改为1: 0110 0000
4,0110 0000 根据 22中的2,再+1 即3,从左至右的第3位改为1: 0110 0100
即 100 的二进制为:0110 0100
代码验证一下,我们计算出来的结果是否正确
验证通过
总结
1,待转换的数字n,转成2的次幂
2,根据次幂结果,在各个对应位置设置为1,其他为0
负整数
比如-100转换成二进制
1,-100 的绝对值:100
2,100转成二进制0110 010
3,原码:1000 0000 0000 0000 0000 0110 0100(100的二进制,最高位设置符号位,负数的最高位要设置成1)
4,反码:1111 1111 1111 1111 1111 1111 1001 1011(除符号位外,0变成1,1变成0)
5,补码:1111 1111 1111 1111 1111 1111 1001 1100(在补码的基础上+1)
即 -100 的二进制为:1111 1111 1111 1111 1111 1111 1001 1100
代码验证一下,我们计算出来的结果是否正确
验证通过
总结
1,待转换的数字-n,进行绝对值,获取正整数n
2,根据该正整数n获取二进制
3,该二进制加上符号位,变成原码
4,在原码基础上,除符号位外,0变1,1变0,变成反码
5,在反码基础上,再+1,得出的即是负数的二进制了
小数
正小数
比如:0.05转成二进制
计算 | 整数位 | 小数位 |
---|---|---|
0.05 (待转换的数字)* 2 = 0.1 | 0 | 0.1 |
0.1(上次计算结果的小数) * 2 = 0.2 | 0 | 0.2 |
0.2(上次计算结果的小数) * 2 = 0.4 | 0 | 0.4 |
0.4(上次计算结果的小数) * 2 = 0.8 | 0 | 0.8 |
0.8(上次计算结果的小数) * 2 = 1.6 | 1 | 0.6 |
0.6(上次计算结果的小数) * 2 = 1.2 | 1 | 0.2 |
0.2(上次计算结果的小数) * 2 = 0.4 | 0 | 0.4 |
0.4(上次计算结果的小数) * 2 = 0.8 | 0 | 0.8 |
0.8(上次计算结果的小数) * 2 = 1.6 | 1 | 0.6 |
0.6(上次计算结果的小数) * 2 = 1.2 | 1 | 0.2 |
… | … | … |
分析
-
计算二进制
1,整个计算在:0.2 0.4 0.8 1.6 …不停的循环
2,我们把整数位的结果拼接在一起:0000110011…
3,在结果集的前缀上追加0.标识:0.0000110011…
通过以上结算方式得到0.05的二进制结果为0.00 0011 0011 0011 0011 0011 … -
我们通过在线转换工具测试一下我们的结果
-
发现结果不一样
我们的结果是:
0.00 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011…
在线工具的结果是:
0.00 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 01
看黄色部分,发现结果有细微的差距
据我猜测,这是在线工具的不能显示更多位,进行了进位导致的,我们基本上可以忽略
我们的计算还是更精确的
总结
1,根据带转换数字,进行 *2 计算,每次的结果的小数位,继续 *2
2,每次的计算结果的整数位拼接在一起,加上0.,就变成了二进制
思考
float在进行转换二进制的时候.,计算出来的结果,出现这种不端循环的,float会自动截取,这样就会导致float数据损失,在float数据在进行计算的时候,就出现了精度损失