Lorsque vous dites que vous voulez convertir des opérateurs mathématiques en chaînes binaires, que voulez-vous dire exactement? Utiliser la représentation ASCII écrite en binaire?
bta le
Je suppose que vous vouliez faire le truc populaire de l'algorithme génétique? :-)
Pour ceux qui sont confus par le code de @ decay comme moi, il utilise ' sprintf
Taylor Liss
@ user1201917 Quel est le problème avec ça? 9est 1001en binaire.
preferred_anon
41
J'ai posé une question similaire . Sur la base de la réponse de @sawa , la manière la plus succincte de représenter un entier dans une chaîne au format binaire est d'utiliser le formateur de chaîne:
"%b"%245=>"11110101"
Vous pouvez également choisir la longueur de la représentation sous forme de chaîne, ce qui peut être utile si vous souhaitez comparer des nombres binaires de largeur fixe:
1.upto(10).each {|n| puts "%04b"% n }0001001000110100010101100111100010011010
J'ai fait un test local pour convertir des entiers en chaîne binaire, mais le résultat montre que des codes comme 245.to_s(2)seront plus rapides que"%b" % 245
Green Su
De plus, cela ne fonctionne pas correctement avec des valeurs négatives.
alex
21
Reprenant l'idée de table de recherche de bta, vous pouvez créer la table de recherche avec un bloc. Les valeurs sont générées lors de leur premier accès et stockées pour plus tard:
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 la représentation binaire 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 +=1end#Reverse output to match the endianness of %b
output.reverseend
Pour vérifier que 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 1end
puts customend
Si vous travaillez uniquement avec les chiffres uniques 0-9, il est probablement plus rapide de créer une table de recherche afin que vous n'ayez pas à appeler les fonctions de conversion à chaque fois.
L'indexation dans cette table de hachage à l'aide de la représentation entière ou sous forme de chaîne d'un nombre donnera sa représentation binaire sous forme de chaîne.
Si vous souhaitez que les chaînes binaires comportent un certain nombre de chiffres (conservez les zéros non significatifs), passez x.to_s(2)à sprintf "%04b", x(où 4est le nombre minimum de chiffres à utiliser).
@ bta- J'encode tous ces caractères en binaire pour pouvoir les utiliser dans un algorithme génétique. J'aime beaucoup l'idée d'une table de recherche pour l'encodage / décodage puisque l'ensemble est limité à 0..9 et + - * /
mcmaloney
2
Si vous recherchez une classe / méthode Ruby, j'ai utilisé ceci, et j'ai également inclus les tests:
Réponses:
Vous avez
Integer#to_s(base)
etString#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:tandis que l'inverse est obtenu avec
String#to_i(base)
:la source
("%08b" % int)
ou("%08b" % string)
pour renvoyer un nombre fixe de bits.-9.to_s(2)
=> "-1001"
Quelqu'un peut-il expliquer cela?9
est1001
en binaire.J'ai posé une question similaire . Sur la base de la réponse de @sawa , la manière la plus succincte de représenter un entier dans une chaîne au format binaire est d'utiliser le formateur de chaîne:
Vous pouvez également choisir la longueur de la représentation sous forme de chaîne, ce qui peut être utile si vous souhaitez comparer des nombres binaires de largeur fixe:
la source
245.to_s(2)
seront plus rapides que"%b" % 245
Reprenant l'idée de table de recherche de bta, vous pouvez créer la table de recherche avec un bloc. Les valeurs sont générées lors de leur premier accès et stockées pour plus tard:
la source
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 la représentation binaire d'un entier donné à l'aide d'opérateurs de base:Pour vérifier que cela fonctionne:
la source
Si vous travaillez uniquement avec les chiffres uniques 0-9, il est probablement plus rapide de créer une table de recherche afin que vous n'ayez pas à appeler les fonctions de conversion à chaque fois.
L'indexation dans cette table de hachage à l'aide de la représentation entière ou sous forme de chaîne d'un nombre donnera sa représentation binaire sous forme de chaîne.
Si vous souhaitez que les chaînes binaires comportent un certain nombre de chiffres (conservez les zéros non significatifs), passez
x.to_s(2)
àsprintf "%04b", x
(où4
est le nombre minimum de chiffres à utiliser).la source
Si vous recherchez une classe / méthode Ruby, j'ai utilisé ceci, et j'ai également inclus les tests:
la source