Tak*_*oto 3 ruby floating-point binary
我一直在寻找是否有一种方法可以将浮点数(ex 123.456:)转换为binary32。我发现了很多从binary32到float的解决方案,反之亦然。
“ funky” y\xE9\xF6B值是表示为字符串的实际二进制值。
如果要将其转换为二进制值的字符串表示形式:
"%032b" % [123.456].pack('e').reverse.each_char.inject(0) { |sum,c| sum = (sum << 8) + c.ord }
=> "01000010111101101110100101111001"
Run Code Online (Sandbox Code Playgroud)
因此,将其分解,可以将“笨拙”的二进制值打包为字符串:
[123.456].pack('e')
Run Code Online (Sandbox Code Playgroud)
其余的将“二进制字符串”转换为整数(将浮点型“强制转换”为整数的相应二进制数字):
reverse # Handles the endian-ness
each_char # Grabs each character in the reversed string
inject # Concatenates the chars converted directly to binary
Run Code Online (Sandbox Code Playgroud)
然后将其"%032b" %显示为二进制字符串,以便您查看。
编辑:正如@looby所观察到的那样,可以使用'g' pack代替'e'来避免该reverse步骤,从而将该解决方案缩短为:([123.456].pack('g').each_char.inject(0) { |sum,c| sum = (sum << 8) + c.ord }并"%032b" %...像以前一样使用以显示它)。
上面的很棒,但是我有一些简化:
[123.456].pack('g').bytes.map{|n| "%08b" % n}.join
Run Code Online (Sandbox Code Playgroud)
使用'g'标志而不是'e'避免必须reverse从输出pack。该bytes方法与调用.ord每个字符的作用相同。然后,将每个映射到8个字符的二进制字符串并将它们连接在一起,而不是取4个整数并进行和/位移位。
| 归档时间: |
|
| 查看次数: |
1561 次 |
| 最近记录: |