2009-12-17 22 views
5

निम्नलिखित करने का सबसे अच्छा तरीका क्या है? बाइनरी -> सूची -> बाइनरी अनावश्यक लगता है।एरलांग बाइनरी पर बाइनरी ऑपरेशंस?

binary_and(A, B) -> 
    A2 = binary_to_list(A), 
    B2 = binary_to_list(B), 
    list_to_binary([U band V || {U, V} <- lists:zip(A2, B2)]). 
+2

जब द्विआधारी उपयोग अनुकूलन पर कुछ संकेत प्राप्त करने के लिए संकलन 'bin_opt_info' विकल्प का उपयोग करें। विवरण के लिए संकलन मैनुअल देखें। – Zed

उत्तर

3

यदि प्रदर्शन की परवाह नहीं है, तो आपका कोड बिल्कुल ठीक है। अन्यथा आप कुछ अलग कर सकते हैं।

उदाहरण के लिए Erlang मनमाने ढंग से आकार के पूर्णांकों का समर्थन करता है:

binary_and(A, B) -> 
    Size = bit_size(A), 
    <<X:Size>> = A, 
    <<Y:Size>> = B, 
    <<(X band Y):Size>>. 

या आप अपने स्वयं के द्विआधारी ज़िप दिनचर्या handcraft कर सकते हैं:

binary_and(A,B) -> binary_and(A, B, <<>>). 

binary_and(<<A:8, RestA/bytes>>, <<B:8, RestB/bytes>>, Acc) -> 
    binary_add(RestA, RestB, <<Acc/bytes, (A band B):8>>); 
binary_and(<<>>, <<>>, Result) -> Result. 

या अनुकूलित संस्करण:

binary_and(A,B) -> binary_and(A, B, <<>>). 

binary_and(<<A:64, RestA/bytes>>, <<B:64, RestB/bytes>>, Acc) -> 
    binary_add(RestA, RestB, <<Acc/bytes, (A band B):64>>); 
binary_and(<<A:8, RestA/bytes>>, <<B:8, RestB/bytes>>, Acc) -> 
    binary_add(RestA, RestB, <<Acc/bytes, (A band B):8>>); 
binary_and(<<>>, <<>>, Result) -> Result. 

या अधिक परिष्कृत

binary_and(A,B) -> binary_and({A, B}, 0, <<>>). 

binary_and(Bins, Index, Acc) -> 
    case Bins of 
    {<<_:Index/bytes, A:64, _/bytes>>, <<_:Index/bytes, B:64, _/bytes>>} -> 
     binary_add(Bins, Index+8, <<Acc/bytes, (A band B):64>>); 
    {<<_:Index/bytes, A:8, _/bytes>>, <<_:Index/bytes, B:8, _/bytes>>} -> 
     binary_add(Bins, Index+1, <<Acc/bytes, (A band B):8>>); 
    {<<_:Index/bytes>>, <<_:Index/bytes>>} -> Acc 
    end. 

वैसे भी आपको उपाय करना होगा यदि आप वास्तव में प्रदर्शन में रुचि रखते हैं। आपके उद्देश्यों के लिए पहला सबसे तेज़ हो सकता है।

3

आप अंधेरे पक्ष की शक्ति को देखने के लिए चाहते हैं ...

binary_and(A, B) -> 
    Size = erlang:byte_size(A), 
    Size = erlang:byte_size(B), 
    Res = hipe_bifs:bytearray(Size, 0), 
    binary_and(Res, A, B, 0, Size). 

binary_and(Res, _A, _B, Size, Size) -> 
    Res. 

binary_and(Res, A, B, N, Size) -> 
    Bin = hipe_bifs:bytearray_sub(A, N) band hipe_bifs:bytearray_sub(B,N), 
    hipe_bifs:bytearray_update(Res, N, Bin), 
    binary_and(Res, A, B, N+1, Size). 
संबंधित मुद्दे