2009-05-03 12 views
1

Ich lerne Ruby und dachte über einen Binär-> Dezimal-Konverter nach. Es erhält eine binäre Zeichenfolge und konvertiert in Dezimaläquivalent. Gibt es eine Möglichkeit, den aktuellen Iterationsschritt in Ruby zu verfolgen, so dass die Variable "x" entfernt werden kann?Wie behalte ich die Iterationsnummer bei der Verwendung von each_char?

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 

Antwort

5

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 

Nebenbei bemerkt, können Sie daran interessiert sein Array#pack und String#unpack. Sie haben Unterstützung für Bit-Strings. Ein noch einfacherer Weg, um dieses Ergebnis zu erhalten, besteht darin, #to_i zu verwenden, z. "101".to_i(2) #=> 5

1
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 
+0

es sagt nicht definiert Methode Zeichen für "0": String – unj2

+0

Welche Version von Ruby verwenden Sie? "ruby --version" um herauszufinden, –

+0

Es sieht aus wie String # Zeichen wurde in 1.8.7 hinzugefügt. Ich werde meine Antwort mit einer Version aktualisieren, die mit früheren Versionen funktioniert. –

0

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" 
Verwandte Themen