2010-10-24 24 views
12

Je suis en train de faire un entier en binaire:entier Binary Erlang

543 = <<"543">> 

Comment puis-je faire sans

integer_to_list(list_to_binary(K)). 
+2

Est-ce que ce ne devrait pas être list_to_binary (integer_to_list (Int))? – hdima

+0

Je pense que ce qu'il voulait dire, c'est que générer une chaîne entièrement fonctionnelle dans erlang prend trop de mem (car sa liste de caractères est liée, donc avec chaque lettre elle consomme 32 bits ou 64 bits supplémentaires pour passer au caractère suivant dans la chaîne) – test30

+0

Je doute fortement que les devs erlang fassent des chaînes une liste chaînée de caractères. Je n'ai pas vérifié moi-même mais je ne peux pas imaginer une telle utilisation inefficace de la liste liée dans la production. – BAR

Répondre

27

Si vous voulez convertir 543-< < « 543 » >> Je ne pense pas que vous pouvez trouver quelque chose plus vite que:

1> list_to_binary(integer_to_list(543)). 
<<"543">> 

Parce que dans ce cas, les fonctions mises en œuvre en C.

Si vous voulez convertir entier à la plus petite représentation binaire possible, vous pouvez utiliser la fonction binary:encode_unsigned du nouveau module binary comme ceci:

1> binary:encode_unsigned(543). 
<<2,31>> 
2> binary:encode_unsigned(543, little). 
<<31,2>> 
4

Vous pouvez essayer quelque chose comme

6> A = 12345.      
12345 
7> B = <<A:32>>. 
<<0,0,48,57>> 

Mais cela nécessite de connaître le nombre maximum de bits à l'avance.

+0

Bonne idée, mais si je ne sais pas. N'y at-il pas une option binaire sans les deux points pour le faire. J'ai essayé _ ne fonctionnait pas. – BAR

+0

Vous pouvez toujours effectuer la conversion par étapes. (A rem 4294967296) pour chaque 32 bits et boucle. –