186

整数 0..9 と数学演算子 + - * / in をバイナリ文字列に作成するにはどうすればよいですか。例えば:

 0 = 0000,
 1 = 0001, 
 ...
 9 = 1001

ライブラリを使用せずにRuby 1.8.6でこれを行う方法はありますか?

4

8 に答える 8

413

あなたは持っていてInteger#to_s(base)、あなたにString#to_i(base)利用可能です。

Integer#to_s(base)10 進数を、指定された基数で数値を表す文字列に変換します。

9.to_s(2) #=> "1001"

逆は次のように取得されString#to_i(base)ます。

"1001".to_i(2) #=> 9
于 2010-02-26T08:52:29.853 に答える
44

同様の質問をしました。@sawaの回答に基づいて、文字列内の整数をバイナリ形式で表す最も簡潔な方法は、文字列フォーマッタを使用することです。

"%b" % 245
=> "11110101"

文字列表現の長さを選択することもできます。これは、固定幅の 2 進数を比較する場合に役立ちます。

1.upto(10).each { |n| puts "%04b" % n }
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
于 2013-12-13T12:03:49.747 に答える
22

bta のルックアップ テーブルのアイデアを参考にして、ブロックを使用してルックアップ テーブルを作成できます。値は最初にアクセスされたときに生成され、後で使用できるように保存されます。

>> lookup_table = Hash.new { |h, i| h[i] = i.to_s(2) }
=> {}
>> lookup_table[1]
=> "1"
>> lookup_table[2]
=> "10"
>> lookup_table[20]
=> "10100"
>> lookup_table[200]
=> "11001000"
>> lookup_table
=> {1=>"1", 200=>"11001000", 2=>"10", 20=>"10100"}
于 2010-02-27T19:06:52.660 に答える
11

当然、実際のプログラムではInteger#to_s(2),String#to_i(2)または"%b"を使用しますが、変換がどのように機能するかに興味がある場合、このメソッドは基本的な演算子を使用して指定された整数のバイナリ表現を計算します。

def int_to_binary(x)
  p = 0
  two_p = 0
  output = ""

  while two_p * 2 <= x do
    two_p = 2 ** p
    output << ((two_p & x == two_p) ? "1" : "0")
    p += 1
  end

  #Reverse output to match the endianness of %b
  output.reverse
end

動作を確認するには:

1.upto(1000) do |n|
  built_in, custom = ("%b" % n), int_to_binary(n)
  if built_in != custom
    puts "I expected #{built_in} but got #{custom}!"
    exit 1
  end
  puts custom
end
于 2013-12-11T19:00:45.563 に答える
4

0 ~ 9 の 1 桁の数字だけを扱う場合は、ルックアップ テーブルを作成する方が高速である可能性が高いため、毎回変換関数を呼び出す必要はありません。

lookup_table = Hash.new
(0..9).each {|x|
    lookup_table[x] = x.to_s(2)
    lookup_table[x.to_s] = x.to_s(2)
}
lookup_table[5]
=> "101"
lookup_table["8"]
=> "1000"

数値の整数または文字列表現を使用してこのハッシュ テーブルにインデックスを付けると、そのバイナリ表現が文字列として生成されます。

バイナリ文字列を特定の桁数にする必要がある場合 (先頭のゼロを保持する)、(は使用する最小桁数) に変更x.to_s(2)します。sprintf "%04b", x4

于 2010-02-26T23:00:19.343 に答える