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
È stato utile?

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"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top