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?
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?
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
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"}
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
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 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.