我一直在寻找是否有一种方法,将浮点数(例如:123.456
)转换为二进制32。我发现很多从binary32到float的解决方案,但反过来也是如此。红宝石浮动到Binary32
回答
以上是真棒,但我有几个简化:
[123.456].pack('g').bytes.map{|n| "%08b" % n}.join
使用'g'
标志,而不是'e'
避免了必须reverse
从pack
输出。 bytes
方法与在每个字符上调用.ord
的功能相同。 然后,不是采用4个整数并进行总和/位移,而是将每个整数映射为8个字符的二进制字符串并将它们连接在一起。
'g'选项是一个很好的捕获,并且摆脱了'reverse'。但是,您所展示的解决方案没有(作为中间值)我认为@TakaGoto所需的整个二进制值(而不仅仅是ASCII二进制字符串)。这就是'注入'在我提出的解决方案中所做的。因此,输出二进制的解决方案是'[123.456] .pack('g')。each_char.inject(0){| sum,c | sum =(sum << 8)+ c.ord}'。 – lurker
“时髦”y\xE9\xF6B
值是以字符串表示的实际二进制值。
如果你想将其转换成二进制值的字符串表示:
"%032b" % [123.456].pack('e').reverse.each_char.inject(0) { |sum,c| sum = (sum << 8) + c.ord }
=> "01000010111101101110100101111001"
所以,要打破它,这给你包装成一个字符串“时髦”的二进制值:
[123.456].pack('e')
其余转换“二进制串”成一个整数(“铸造”浮子的适当的二进制位数为整数):
reverse # Handles the endian-ness
each_char # Grabs each character in the reversed string
inject # Concatenates the chars converted directly to binary
然后"%032b" %
将其显示为二进制字符串,以便您查看它。
编辑:由于@looby机敏地观察到的,“G”可以在pack
而不是“E”被用来避免reverse
步骤,缩短该溶液:[123.456].pack('g').each_char.inject(0) { |sum,c| sum = (sum << 8) + c.ord }
(并且为了将其显示为在使用前"%032b" %...
)。
* + 1 * ...非常好的回答和* + 1 * ... –
您应该使用String#unpack和Array#pack:
[123.456].pack('g').unpack('B*').first
#=> "01000010111101101110100101111001"
的
- 1. 如何转换binary32漂浮在红宝石
- 2. 浮动数组到base64红宝石
- 3. 红宝石双浮动浮标0
- 4. 红宝石浮点错误
- 5. 红宝石浮法问题
- 6. 红宝石浮子解析
- 7. 红宝石 - 增加负浮动值
- 8. 浮动倍数红宝石矢量
- 9. 红宝石浮动算术阵列
- 10. 谈到红宝石
- 11. 得到红宝石
- 12. 红宝石如何找到宝石?
- 13. 红宝石没有检测到宝石
- 14. 红宝石rbenv宝石没有找到
- 15. 在红宝石浮法精度
- 16. 处理红宝石浮法像java
- 17. 红宝石问题与浮点迭代
- 18. 红宝石:字符串浮点整数
- 19. 迭代通过浮点数红宝石
- 20. 红宝石散列在红宝石
- 21. 红宝石宝石文档
- 22. 宝石安装红宝石
- 23. 调试宝石红宝石
- 24. 红宝石程序宝石
- 25. 错误红宝石宝石
- 26. Twitter的红宝石宝石
- 27. 卸载红宝石宝石
- 28. 红宝石宝石 - LoadError
- 29. 红宝石宝石LoadError
- 30. 安装红宝石宝石
可能重复[如何转换binary32漂浮在红宝石(http://stackoverflow.com/questions/9698101/how-to-convert-binary32 - 浮动在红宝石) – tadman
我看到那篇文章,但不知道它是如何工作的。我觉得它是因为Ruby中的一切都是一个对象,我需要以某种方式获得实际的浮动数。 – TakaGoto
'pack'和'unpack'对于在二进制格式之间转换很有用。无论如何,一切都是一个对象,甚至是浮点数。为了逆转'unpack'的过程,你通常只需要用相同的规范调用'pack'。 – tadman