2011-01-23 12 views
6

मेरे पास बाइनरी एम है जैसे कि 34 = हमेशा मौजूद रहेगा और शेष किसी भी अंक के बीच भिन्न हो सकते हैं लेकिन हमेशा एक पूर्णांक होंगे।बाइनरी टू इंटीजर -> एरलांग

M = [<<"34=21">>] 

जब मैं इस आदेश चला रहा

hd([X || <<"34=", X/binary >> <- M]) 

Answer -> <<"21">> 

की तरह एक जवाब मैं इस सबसे देखभाल के रूप में संभव के रूप में कुशल बनाने के लिए ले जाया के साथ एक पूर्णांक होना करने के लिए प्राप्त कर सकते हैं मिल सकता है?

उत्तर

20
[<<"34=",X/binary>>] = M, 
list_to_integer(binary_to_list(X)). 

पूर्णांक 21

+0

इस यह करने के लिए सबसे कारगर तरीका है? कोई विचार क्यों बाइनरी से पूर्णांक तक सीधे जाने के लिए कोई फ़ंक्शन नहीं है? – BAR

+1

क्योंकि एक बाइनरी डिफ़ॉल्ट रूप से पूर्णांक का एक सेट है। आपने यहां जो किया है वह पूर्णांक वर्णों का प्रतिनिधित्व करता है जो एरलांग स्ट्रिंग के रूप में व्याख्या करना जानता है। मूल रूप से ऐसा करने के लिए एक बीआईएफ 'binary_to_list_to_integer' होगा क्योंकि '<> = <<1,2,3>> 'आपको पहले से ही' 1 'देगा और यह काफी बाइनरी-टू-इंटीजर रूपांतरण है, मुझे लगता है। –

1

पैदावार कि एक नंबर के एक स्ट्रिंग प्रतिनिधित्व एन -48 द्वारा परिवर्तित किया जा सकता है। बहु अंकों की संख्या के लिए आप द्विआधारी से अधिक गुना कर सकते हैं, अंकों की स्थिति की शक्ति से गुणा:

-spec to_int(binary()) -> integer(). 
to_int(Bin) when is_binary(Bin) -> 
    to_int(Bin, {size(Bin), 0}). 

to_int(_, {0, Acc}) -> 
    erlang:trunc(Acc); 
to_int(<<N/integer, Tail/binary>>, {Pos, Acc}) when N >= 48, N =< 57 -> 
    to_int(Tail, {Pos-1, Acc + ((N-48) * math:pow(10, Pos-1))}). 

इस के प्रदर्शन के आसपास 100 बार list_to_integer(binary_to_list(X)) विकल्प का उपयोग करने की तुलना में धीमी है।

17

As of R16B, BIF binary_to_integer/1 इस्तेमाल किया जा सकता:

OTP-10300

जोड़ा चार नए BIFS, erlang:binary_to_integer/1,2, erlang:integer_to_binary/1, erlang:binary_to_float/1 और erlang:float_to_binary/1,2। ये बीआईएफ के समान काम करते हैं, उनकी सूची समकक्ष काम करते हैं, सिवाय इसके कि वे बाइनरी पर काम करते हैं। अधिकांश मामलों में और बाइनरी में कनवर्ट करना से और सूचियों में कनवर्ट करने से तेज़ है।

ये बीआईएफ erlang स्रोत फ़ाइलों में स्वतः आयात किए जाते हैं और इसलिए erlang उपसर्ग के बिना उपयोग किया जा सकता है।

ताकि लगेगा जैसे:

[<<"34=",X/binary>>] = M, 
binary_to_integer(X). 
+0

अंततः वे इसे करते हैं .. – BAR

संबंधित मुद्दे