2013-07-18 60 views
2

我一直在尋找是否有一種方法,將浮點數(例如:123.456)轉換爲二進制32。我發現很多從binary32到float的解決方案,但反過來也是如此。紅寶石浮動到Binary32

+0

可能重複[如何轉換binary32漂浮在紅寶石(http://stackoverflow.com/questions/9698101/how-to-convert-binary32 - 浮動在紅寶石) – tadman

+0

我看到那篇文章,但不知道它是如何工作的。我覺得它是因爲Ruby中的一切都是一個對象,我需要以某種方式獲得實際的浮動數。 – TakaGoto

+1

'pack'和'unpack'對於在二進制格式之間轉換很有用。無論如何,一切都是一個對象,甚至是浮點數。爲了逆轉'unpack'的過程,你通常只需要用相同的規範調用'pack'。 – tadman

回答

4

以上是真棒,但我有幾個簡化:

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

使用'g'標誌,而不是'e'避免了必須reversepack輸出。 bytes方法與在每個字符上調用.ord的功能相同。 然後,不是採用4個整數並進行總和/位移,而是將每個整數映射爲8個字符的二進制字符串並將它們連接在一起。

+0

'g'選項是一個很好的捕獲,並且擺脫了'reverse'。但是,您所展示的解決方案沒有(作爲中間值)我認爲@TakaGoto所需的整個二進制值(而不僅僅是ASCII二進制字符串)。這就是'注入'在我提出的解決方案中所做的。因此,輸出二進制的解決方案是'[123.456] .pack('g')。each_char.inject(0){| sum,c | sum =(sum << 8)+ c.ord}'。 – lurker

4

「時髦」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" %...)。

+0

* + 1 * ...非常好的回答和* + 1 * ... –

2

您應該使用String#unpackArray#pack

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