2016-06-22 6 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 

Iの数に応じて長さ4、8、16ビットに4ビット(例えば3、11)パッドをすることによって表現する必要がない生じる場合。

答えて

1

0b0001.classと記述すると、Fixnumになります。

puts 0b1000書き込みは8を示しており、それがこのFixnumかがベースに格納されて明らかだ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 

inspectメソッドは、整数を取り、バイナリの文字列表現を生成するto_s(2)を使用します。しかし、バイナリの前にあるゼロは、それが基数10に変換されるときに失われます。そのため、検査方法 は文字列の先頭に手動でゼロを追加する必要があります。

文字列の正面に正しい数のゼロを完全に動的に追加する方法はありません。

私がここでやっているのは、パックされていないバイナリ文字列を含むことができる最小幅(4の倍数)を計算することです。したがって、追加されていない長さが5文字の場合、最終的な幅は8になります。パディングなしの長さが2の場合、最終的な長さは4です。

代わりに、それを計算するのではなく、binary_widthを実行時に変更した外部変数をinspect関数から参照します。

+0

ありがとう、私はちょうどそれを編集し、誤ってプロセスでそれを壊しました。私はそれを試してみましょう。 –

+0

@randynewfieldは今すぐ動作するはずです。それはちょうどタイプミスですが、 'inspect'メソッドのエラーが消されるため、デバッグするのが少し面倒です。 –

+0

4つめのビットが設定されている場合は、未設定のビットが4つ追加されます。 ex: '0b1000 => 0b0000_1000'だと思います。バイナリ幅を定義する以前の方法では、動的に計算するのではなく、これを解決できますか? –

関連する問題