Wie kann ich den Überblick über die Wiederholungszahl zu halten, während mit each_char?

StackOverflow https://stackoverflow.com/questions/815977

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
War es hilfreich?

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"
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top