Wie kann ich den Überblick über die Wiederholungszahl zu halten, während mit each_char?
Frage
Ich lerne Ruby und Gedanken zur Herstellung einer Binär-> Dezimal-Konverter. Es wird ein binärer String und wandelt in dezimale Äquivalent. Gibt es eine Möglichkeit, den Überblick über den aktuellen Iterationsschritt in Ruby zu halten, so dass der Variable ‚x‘ entfernt werden kann?
def convert(binary_string)
decimal_equivalent = 0
x=0
binary_string.reverse.each_char do |binary|
decimal_equivalent += binary.to_i * (2 ** x)
x+=1
end
return decimal_equivalent
end
Lösung
Ja, durch die sehr starke enumerator Bibliothek:
require 'enumerator'
def convert(binary_string)
decimal_equivalent = 0
binary_string.reverse.enum_for(:each_char).each_with_index do |binary, i|
decimal_equivalent += binary.to_i * (2 ** i)
end
return decimal_equivalent
end
Im übrigen kann man in Array#pack
und String#unpack
interessiert. Sie haben die Unterstützung für Bitketten. Auch ein noch einfacherer Weg, um dieses Ergebnis zu erhalten, ist #to_i
zu verwenden, z.B. "101".to_i(2) #=> 5
Andere Tipps
binary_string.reverse.chars.each_with_index do |binary, i|
decimal_equivalent += binary.to_i * (2 ** i)
end
oder auf Versionen älter als 1.8.7:
binary_string.reverse.split(//).each_with_index do |binary, i|
decimal_equivalent += binary.to_i * (2 ** i)
end
Für die Menschen (wie mich), die diese Antwort von Google gefunden,
Hier ist die einfache Möglichkeit, binäre zu konvertieren -> Dezimal in Ruby (und wieder zurück):
# The String.to_i function can take an argument indicating
# the base of the number represented by the string.
decimal = '1011'.to_i(2)
# => 11
# Likewise, when converting a decimal number,
# you can provide the base to the to_s function.
binary = 25.to_s(2)
# => "11001"
# And you can pad the result using right-justify:
binary = 25.to_s(2).rjust(8, '0')
# => "00011001"