2009-03-01 15 views
46

मैं एरलांग में दो द्विआधारी कैसे जोड़ूं?मैं एरलांग में दो द्विआधारी कैसे जोड़ूं?

उदाहरण के लिए, मान लीजिए कि मैं करते हैं:

B1 = <<1,2>>. 
B2 = <<3,4>>. 

मैं कैसे बी 1 श्रेणीबद्ध करते हैं और बी 2 बी 3 एक द्विआधारी जो है < < 1,2,3,4 >> बनाने के लिए?

कारण मैं यह पूछ रहा हूं क्योंकि मैं कुछ नेटवर्किंग प्रोटोकॉल के लिए एक पैकेट एन्कोड करने के लिए कोड लिख रहा हूं। मैं पैकेट में फ़ील्ड के लिए एन्कोडर्स लिखकर इसे कार्यान्वित कर रहा हूं और मुझे पूरे पैकेट को बनाने के लिए उन क्षेत्रों को जोड़ना होगा।

शायद मैं यह गलत तरीका कर रहा हूं। क्या मुझे पैकेट को पूर्णांक की सूची के रूप में बनाना चाहिए और आखिरी पल में सूची को बाइनरी में परिवर्तित करना चाहिए?

उत्तर

31

जवाब नहीं है। gen_tcp: भेजें गहरी सूचियां स्वीकार करेंगे। तो, concatenation बस है:

B3 = [B1, B2]. 

यह ओ (1) है। आम तौर पर, इस तरह के डेटा से निपटने पर हमेशा गहरी सूची संरचनाएं तैयार होती हैं और आईओ रूटीन आउटपुट पर संरचना चलती हैं। एकमात्र जटिलता यह है कि किसी भी मध्यवर्ती दिनचर्या में गहरी सूचियां स्वीकार होंगी।

+0

धन्यवाद! मैं Erlang में गहरी सूचियों और आईओ सूचियों की अवधारणाओं से परिचित नहीं था। –

+21

मुझे यह नहीं है कि कोड सही है। यह लौटाता है: '[<<1,2>>, <<3,4>>] 'और यह नहीं है कि @ कैले स्पैंडन ने पूछा। तो जवाब गलत है। – Worker

+2

@Worker - उत्तर cthulahoops वास्तव में दो द्विआधारी को जोड़ना नहीं है। इस जवाब का मुद्दा यह है कि यदि आप जिस कोड के साथ काम कर रहे हैं, वह आईओलिस्ट स्वीकार करेगा, तो आप पहली बार दो बाइनरी को संयोजित करने की कम्प्यूटेशनल लागत से बच सकते हैं। चूंकि मूल प्रश्नकर्ता ने कहा कि वे एक नेटवर्क पैकेट बनाने की कोशिश कर रहे थे, इस जवाब से पता चलता है कि शायद दो बाइनरी को जोड़ना मूल प्रश्नकर्ता की जरूरतों को हासिल करने का सबसे अच्छा तरीका नहीं है। – Nick

112
28> B1= <<1,2>>. 
<<1,2>> 
29> B2= <<3,4>>. 
<<3,4>> 
30> B3= <<B1/binary, B2/binary>>. 
<<1,2,3,4>> 
31> 
+0

बनाने से अधिक कुशल (अंतरिक्ष-वार) हो सकता है संभवतः यह ओ (1) ऑपरेशन नहीं है, इसलिए यह अभी भी एक गहरी सूची (आईओ सूची) बनाने के लिए समझ में आता है जब तक मैं पैकेट भेजने के लिए तैयार नहीं हूं तब तक गहरी सूची में चलने वाले cthulahoops और स्थगित द्वारा सुझाया गया है? –

+15

दोनों उत्तर अच्छे हैं। cthulahoops से 'io_list' संरचनाएं I/o के लिए आदर्श हैं; हालांकि, अब यह "एरलांग कॉन्सटेनेट बाइनरीज़" के लिए शीर्ष Google हिट है, इसलिए यहां भी सख्ती से सही जवाब देना अच्छा लगता है। – JasonSmith

12

पिछले जवाब पर निर्माण करने के लिए:

bjoin(List) -> 
    F = fun(A, B) -> <<A/binary, B/binary>> end, 
    lists:foldr(F, <<>>, List). 
+0

यह बहुत अच्छा है! – Tommy

13

एक io_list का उपयोग करने के लिए, तुम कर सकते हो:

erlang:iolist_to_binary([<<"foo">>, <<"bar">>]) 

कौन सा अच्छा और पठनीय है। यदि आप अधिक सुविधाजनक हैं तो आप सूचियों और चीजों का भी उपयोग कर सकते हैं।

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