2016-06-22 15 views
1

我想爲某些對等人做演示,我想強制IRB以二進制形式返回值。有沒有辦法強制紅寶石以二進制的形式輸出結果

例如,它目前正在返回結果以10爲基數無論哪個基地的輸入是:

0b1111 
# => 15 #should return 1111 or 0b1111 
0b0001 | 0b0011 
# => 3 #should return 0011 or 0b0011 

有沒有辦法迫使這個結果?我想演示按位運算符,並且他們更容易理解是否他們看到位流動而不是基數10的數字被返回,我必須在之後轉換爲基數2。

另外我想所有的結果都是4位的倍數。如果可能,用下劃線或空格分隔半字節分組。

例如:

0b0001_0101 
# => 0b0001_0101 #or 0b0001 0101, or 0001 0101, or 0001_0101 

如果我導致不需要由4位(例如3,11)墊它被表示爲4,8,16個在長度取決於數量的比特。

回答

1

如果你寫0b0001.class你會發現它是Fixnum。

寫作puts 0b1000顯示8,並且很明顯這是長整數存儲在基座10

所以就我所知,沒有任何辦法阻止轉換到基座10

如果你想控制Fixnum對象對象顯示在IRB的方式,可以實現對類的自定義inspect方法:

class Fixnum 
    def inspect 
    unpadded_binary_string = to_s(2) 
    binary_width = if unpadded_binary_string.length % 4 == 0 
     unpadded_binary_string.length 
    else 
     ((unpadded_binary_string.length/4) * 4) + 4 
    end 
    padded_binary_string = "%0#{binary_width}d" % unpadded_binary_string 
    # join groups of 4 with an underscore 
    padded_binary_string = padded_binary_string.scan(/.{4}/).join("_") 
    "0b" + padded_binary_string 
    end 
end 

結果:

irb(main):007:0> 0b1000 
=> 0b1000 
irb(main):011:0> 99999999 
=> 0b0101_1111_0101_1110_0000_1111_1111 

檢查方法使用to_s(2),它採用一個整數併產生一個二進制的字符串表示形式。但是,二進制文件前面的零值在轉換爲基數10時會丟失。這就是爲什麼檢查方法 需要手動將零加到字符串的前面。

我無法想象以完全動態的方式將正確數量的零添加到字符串的前面。

我在這裏做的是計算可以包含unpadded二進制字符串的最小寬度(以4的倍數)。因此,如果未填充長度爲5個字符,則最終寬度將爲8.如果未填充長度爲2,則最終長度爲4.

而不是隨時計算它,也可以將binary_width設置爲一個在運行時更改的外部變量,然後從檢查函數中引用它。

+0

謝謝,我剛剛編輯它,並意外破壞了它的過程。讓我試着解決它。 –

+0

@randynewfield現在應該工作。這只是一個錯字,但有點煩人的調試,因爲'inspect'方法的錯誤是沉默的。 –

+0

工作得很好,唯一的問題是,如果設置了第四位,則會增加4個未設置的位。例如:'0b1000 => 0b0000_1000'雖然我猜這是宜居的。你以前定義二進制寬度的方法是否可以解決這個問題,而不是試圖動態計算它? –