2009-05-03 7 views
1

Я изучаю Ruby и думал о создании Binary-> Decimal converter. Он получает двоичную строку и преобразуется в десятичный эквивалент. Есть ли способ отслеживать текущий шаг итерации в рубине, чтобы можно было удалить переменную «x»?Как отслеживать номер итерации при использовании 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 

ответ

5

Да, с помощью очень мощного перечислителя библиотеки:

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 

Кстати, вы можете быть заинтересованы в Array#pack, и String#unpack. Они поддерживают битовые строки. Кроме того, еще более простой способ получить этот результат - использовать #to_i, например. "101".to_i(2) #=> 5

1
binary_string.reverse.chars.each_with_index do |binary, i| 
    decimal_equivalent += binary.to_i * (2 ** i) 
end 

Или на версиях старше 1.8.7:

binary_string.reverse.split(//).each_with_index do |binary, i| 
    decimal_equivalent += binary.to_i * (2 ** i) 
end 
+0

он говорит, не определено метод символы для «0»: строка – unj2

+0

Какую версию рубина вы используете? «ruby -version», чтобы узнать, –

+0

Похоже, что в 1.8.7 добавлено строковое # chars. Я обновляю свой ответ с версией, которая работает с более ранними версиями. –

0

Для людей (как я), которые нашли этот ответ от Google,

Вот простой способ преобразовать двоичный -> десятичного рубина (и обратно):

# 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"