Come posso tenere traccia del numero di iterazione mentre utilizzo each_char?
Domanda
Sto imparando Ruby e ho pensato di creare un convertitore decimale binario. Ottiene una stringa binaria e si converte in equivalente decimale. C'è un modo per tenere traccia dell'attuale fase di iterazione in ruby ??in modo che la variabile 'x' possa essere rimossa?
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
Soluzione
Sì, utilizzando la potente libreria di enumeratori:
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
Per inciso, potresti essere interessato a Array # pack
e String # unpack
. Hanno il supporto per stringhe di bit. Inoltre, un modo ancora più semplice per ottenere questo risultato è utilizzare #to_i
, ad es. " 101 " .to_i (2) # = > 5
Altri suggerimenti
binary_string.reverse.chars.each_with_index do |binary, i|
decimal_equivalent += binary.to_i * (2 ** i)
end
O su versioni precedenti alla 1.8.7:
binary_string.reverse.split(//).each_with_index do |binary, i|
decimal_equivalent += binary.to_i * (2 ** i)
end
Per le persone (come me) che hanno trovato questa risposta da Google,
Ecco il modo semplice per convertire i file binari - > decimale in rubino (e viceversa):
# 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"