我一直在尋找是否有一種方法,將浮點數(例如: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