Как отслеживать номер итерации при использовании each_char? - PullRequest
1 голос
/ 03 мая 2009

Я изучаю Ruby и подумал о том, чтобы сделать двоичный-> десятичный преобразователь. Он получает двоичную строку и преобразует ее в десятичный эквивалент. Есть ли способ отслеживать текущий шаг итерации в ruby, чтобы можно было удалить переменную 'x'?

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

Ответы [ 3 ]

5 голосов
/ 03 мая 2009

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

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 голос
/ 03 мая 2009
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 голосов
/ 03 декабря 2011

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

Вот простой способ преобразования двоичного числа -> десятичного числа в ruby ​​(и обратно):

# 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"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...