【发布时间】:2021-07-02 04:46:33
【问题描述】:
我正在尝试将带逗号的十进制数字转换为二进制。我已经看到,例如,如果您有十进制数字 5.2,您可以将其转换为 101.10,因为 5 是 101,2 是 10,但我看到了一种我不太了解的方法。
例如,数字 93.3125 是 0000 0101 1101 0101。为什么? 还有其他方法可以帮助您将带逗号的小数转换为二进制吗?
【问题讨论】:
我正在尝试将带逗号的十进制数字转换为二进制。我已经看到,例如,如果您有十进制数字 5.2,您可以将其转换为 101.10,因为 5 是 101,2 是 10,但我看到了一种我不太了解的方法。
例如,数字 93.3125 是 0000 0101 1101 0101。为什么? 还有其他方法可以帮助您将带逗号的小数转换为二进制吗?
【问题讨论】:
您需要分别处理每个部分(小数点前后)。整数部分通过后继除以基数转换,小数部分通过后继乘以基数转换。在你的情况下base = 2:
5.2 dec -> 5 + 0.2 dec
整数部分
5 % 2 = 1 // binary digit
5 / 2 = 2 // leftover for next iteration
2 % 2 = 0 // binary digit
2 / 2 = 1 // leftover for next iteration
1 % 2 = 1 // binary digit
1 / 2 = 0 // leftover for next iteration
不要忘记数字必须以相反的顺序使用(但是你的 5 是一样的):
5 dec = 1 0 1 bin
小数部分
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6 * 2 = 1.2
0.2 * 2 = 0.4
...
一切都是十进制的。结果的整数部分是您的数字(按顺序),小数部分是下一次迭代的剩余部分。所以结果是:
0.2 dec = 0 . 0 0 1 1 0 ... bin
放在一起:
5.2 dec = 101.00110... bin
【讨论】:
5.2 的小数部分(小数点后)是0.2,而2 是您想要转换为二进制数的基础。因此,您只需将数字的小数部分乘以基数 (2) 结果的整数部分是输出的数字,而您以相同的方式再次乘以基数的小数部分...重复此操作,直到您有足够的数字或剩余为零。 2. 0.2*2 是 0.4 我忘记删除 1 因为我从上一行复制粘贴它已经修复了它
5.2*256,将结果的整数部分转换为二进制,然后输入小数点,以便后面有8 数字.. . 5.2*256 = 1331 dec -> 10100110011 bin -> 5.2 dec = 101.00110011 ... 因为2^8 = 256 如果你想要更多位使用更大的数字,例如1024 = 2^10 ...这称为定点数学
有多种方法可以将十进制数转换为由 1 和 0 组成的字符串。您刚刚演示了其中的两个。
如果您将数字(以 base-10 位表示法表示) 93.3125 转换为“二进制”(以 base-2 位表示法表示) 你会得到 @ 987654322@
如果您将其转换为计算机语言中使用的二进制浮点格式,您会得到一个由 1 和 0 组成的字符串,可能带有一个前导位表示符号,以及一些其他位表示指数——您需要一个格式描述文档进行解码。
将“5.2”翻译成“101.10”(分别翻译小数点前后的部分)对我来说是一个新的概念,它不是位置符号的数学正确翻译。 "5"=>"101" 是正确的,但 ".2"=>".10" 是不正确的;十进制中的“.2”是十分之二,也就是五分之一,以二为底的是“.001100110011...”(五分之一是以二为底的重复小数,就像三分之一是以十为底的重复小数一样。)你会如何翻译“1.02”?
所以是的,有很多方法可以编码二进制数字。不同的代码有不同的用途。
【讨论】: