194 votes

Comment convertir une chaîne ou un entier en binaire en Ruby?

Comment créer des entiers 0..9 et des opérateurs mathématiques + - * / in en chaînes binaires. Par exemple:

  0 = 0000,
 1 = 0001, 
 ...
 9 = 1001
 

Est-il possible de faire cela avec Ruby 1.8.6 sans utiliser de bibliothèque?

427voto

Mike Woodhouse Points 27748

Vous avez Integer#to_s(base) et String.to_i(base) à votre disposition.

Integer#to_s(base) convertit un nombre décimal en une chaîne représentant le nombre dans la base spécifiée:

 9.to_s(2) #=> "1001"
 

tandis que l’inverse est obtenu avec String#to_i(base) :

 "1001".to_i(2) #=> 9
 

46voto

Alex Popov Points 1209

J'ai demandé à une question similaire. Basé sur @sawa's réponse, le plus succinct de manière à représenter un entier en une chaîne de caractères dans le format binaire est d'utiliser la chaîne de formatage:

"%b" % 245
=> "11110101"

Vous pouvez également choisir la durée de la représentation de chaîne pour être, ce qui peut être utile si vous voulez comparer à largeur fixe nombres binaires:

1.upto(10).each { |n| puts "%04b" % n }
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010

23voto

Michael Kohl Points 33345

Reprenant l'idée de la table de consultation de bta, vous pouvez créer la table de consultation avec un bloc. Les valeurs sont générées lors de leur premier accès et stockées pour plus tard:

 >> lookup_table = Hash.new { |h, i| h[i] = i.to_s(2) }
=> {}
>> lookup_table[1]
=> "1"
>> lookup_table[2]
=> "10"
>> lookup_table[20]
=> "10100"
>> lookup_table[200]
=> "11001000"
>> lookup_table
=> {1=>"1", 200=>"11001000", 2=>"10", 20=>"10100"}
 

11voto

joews Points 4953

Vous utiliseriez naturellement Integer#to_s(2) , String#to_i(2) ou "%b" dans un programme réel, mais si vous êtes intéressé par le fonctionnement de la traduction, cette méthode calcule le binaire représentation d'un entier donné à l'aide d'opérateurs de base:

 def int_to_binary(x)
  p = 0
  two_p = 0
  output = ""

  while two_p * 2 <= x do
    two_p = 2 ** p
    output << ((two_p & x == two_p) ? "1" : "0")
    p += 1
  end

  #Reverse output to match the endianness of %b
  output.reverse
end
 

Pour vérifier cela fonctionne:

 1.upto(1000) do |n|
  built_in, custom = ("%b" % n), int_to_binary(n)
  if built_in != custom
    puts "I expected #{built_in} but got #{custom}!"
    exit 1
  end
  puts custom
end
 

4voto

bta Points 22525

Si vous êtes seul à travailler avec la seule chiffres de 0 à 9, il est probablement plus rapide à construire une table de recherche de sorte que vous n'avez pas à appeler les fonctions de conversion de tous les temps.

lookup_table = Hash.new
(0..9).each {|x|
    lookup_table[x] = x.to_s(2)
    lookup_table[x.to_s] = x.to_s(2)
}
lookup_table[5]
=> "101"
lookup_table["8"]
=> "1000"

Indexation dans cette table de hachage en utilisant soit le nombre entier ou une chaîne représentant un nombre donnera sa représentation binaire comme une chaîne de caractères.

Si vous avez besoin des chaînes binaires à un certain nombre de chiffres (garder les zéros à gauche), puis changez x.to_s(2) de sprintf "%04b", x (où 4 est le nombre minimum de chiffres).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X