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

Lorsque j'exécute ce code dans irb, le message d'erreur suivant est la sortie. et quand j'ai compilé la même logique en python, ça marche absolument bien. J'ai googlé « RangeError: bignum trop grand pour convertir en` long »: mais n'a pas trouvé la réponse pertinente S'il vous plaît me aider :(Merci à l'avanceRangeError: bignum trop grand pour être converti en `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

Comme je l'ai dit ci-dessous, Ruby a ce built-in sous la forme de 'num.to_i (2)' :-) –

Répondre

2

Essayez cette

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

Merci beaucoup !! ça a marché!! : D – aahlad

4

Qu'est-ce que vous obtenez avec num[n] est une chaîne d'un caractère, et non pas un numéro que je réécris votre code plus idiomatiques Ruby, voici comment cela ressemblerait à ceci:

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

Le plus idiomatique cependant serait probablement num.to_i(2), parce que comme je le vois, vous essayez de convertir binaire en décimal, ce qui est exactement ce que cela fait.

+0

+1 le each_char.with_index est un modèle vraiment sympa - nouveau pour moi, alors merci. – joelparkerhenderson

+0

Notez que '.with_index' en tant que méthode séparée a été ajouté en 1.9, avant qu'il y ait seulement' each_with_index'. –

+0

+1 pour indiquer la méthode de conversion intégrée. –

Questions connexes