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

Wenn ich diesen Code in Irb ausführen, ist die folgende Fehlermeldung die Ausgabe. und wenn ich die gleiche Logik in Python kompiliert habe, funktioniert es absolut gut. Ich habe gegoogelt „Auslöser Range: bignum zu groß in` lange zu konvertieren ': aber nicht die entsprechende Antwort gefunden haben Bitte helfen Sie mir :(Vielen Dank im VorausRangeError: bignum zu groß, um in `long 'umzuwandeln

 
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

Wie ich unten gesagt habe, hat Ruby das in Form von 'num.to_i (2)' eingebaut :-) –

Antwort

2

Versuchen Sie, diese

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

Vielen Dank !! das hat funktioniert!! : D – aahlad

4

Was Sie bekommen mit num[n] eine Zeichenfolge ein Zeichen ist, nicht eine Zahl, die ich Ihren Code mehr idiomatische Ruby-neu geschrieben, ist dies, wie es aussehen würde:

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

Das idiomatische aber wäre wahrscheinlich num.to_i(2), denn wie ich sehe, versuchen Sie, von binär zu dezimal zu konvertieren, was genau das ist.

+0

+1 der each_char.with_index ist ein wirklich schönes Muster - neu für mich, also danke. – joelparkerhenderson

+0

Beachten Sie, dass '.with_index' als separate Methode in 1.9 hinzugefügt wurde, bevor es nur' each_index 'gab. –

+0

+1 für das Hinweis auf die integrierte Konvertierungsmethode. –