Ruby浮动到Binary32

时间:2013-07-18 19:41:55

标签: ruby floating-point binary

我一直在寻找是否有一种方法可以将浮点数(例如:123.456)转换为二进制32。我发现了很多从binary32到float的解决方案,但反之亦然。

3 个答案:

答案 0 :(得分:4)

“funky”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 :(得分:4)

以上是很棒的,但我有一些简化:

[123.456].pack('g').bytes.map{|n| "%08b" % n}.join

使用'g'标志而不是'e'可以避免reverse来自pack的输出。 bytes方法与在每个字符上调用.ord的方法相同。 然后,不是取4个整数并进行和/位移,而是将每个整数映射到8个字符的二进制字符串并将它们连接在一起。

答案 2 :(得分:2)

您应该使用String#unpackArray#pack

[123.456].pack('g').unpack('B*').first
#=> "01000010111101101110100101111001"