1

我正在学习 Ruby,并想制作一个 Binary->Decimal 转换器。它获取一个二进制字符串并转换为等效的十进制。有没有办法跟踪 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
4

3 回答 3

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

于 2009-05-03T01:44:00.797 回答
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
于 2009-05-03T00:37:50.503 回答
0

对于从谷歌找到这个答案的人(比如我),

这是在 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"
于 2011-12-03T13:54:47.507 回答