我一直在寻找是否有一种方法可以将浮点数(例如:123.456
)转换为二进制32。我发现了很多从binary32到float的解决方案,但反之亦然。
答案 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" %
将其显示为二进制字符串,以便您查看它。
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#unpack和Array#pack:
[123.456].pack('g').unpack('B*').first
#=> "01000010111101101110100101111001"