2012-04-05 32 views
0
num = "0000001000000000011000000000000010010011000011110000000000000000" 
for n in 0...num.length 
    temp = num[n] 
    dec = dec + temp*(2**(num.length - n - 1)) 
end 
puts dec 

このコードをirbで実行すると、次のエラーメッセージが出力されます。私がPythonで同じロジックをコンパイルすると、それは絶対にうまく動作しています。 「長い `に変換するには大きすぎるBIGNUM:私は」例外RangeErrorをGoogleで検索しましたが、該当する答えを見つけられませんでした 事前に感謝:(私を助けてくださいRangeError:大きすぎてlong型に変換できない

 
RangeError: bignum too big to convert into long' 
     from (irb):4:in*' 
     from (irb):4:in block in irb_binding' 
     from (irb):2:ineach' 
     from (irb):2 
     from C:/Ruby193/bin/irb:12:in `'

+1

私が下で述べたように、Rubyはこの組み込み関数を 'num.to_i(2)'の形で持っています:-) –

答えて

2

をこの

num = "0000001000000000011000000000000010010011000011110000000000000000" 
dec = 0 
for n in 0...num.length 
    temp = num[n] 
    dec = dec + temp.to_i * (2**(num.length - n - 1)) 
end 
puts dec 
を試してみてください。
+0

ありがとう!それは働いた! :D – aahlad

4

何がnum[n]で取得することは、1つの文字列ではなく、数ある私は、これは、それは次のようになりますどのように、より多くの慣用的なルビーにあなたのコードを書き直しました:。

dec = num.each_char.with_index.inject(0) do |d, (temp, n)| 
    d + temp.to_i * (2 ** (num.length - n - 1)) 
end 

しかし、最も慣用的なのはおそらくnum.to_i(2)です。これを見ると、バイナリから10進に変換しようとしているからです。

+0

+1 each_char.with_indexは本当に素敵なパターンです。新しくありがとうございます。 – joelparkerhenderson

+0

'each_with_index'だけが存在する前に、別のメソッドとしての' .with_index'が1.9で追加されたことに注意してください。 –

+0

+1組み込みの変換方法を指摘します。 –

関連する問題