Code below does more than 20MB/s (more than 14 times faster than yours) on my 2.2GHz notebook using native:<br><br>unpack3(UD) -> unpack3(<<>>, UD, <<>>).<br><br>unpack3(_, <<>>, Acc) -> Acc;    % <-- implement your padding here if you want<br>
unpack3(<<>>, <<A1:1, B1:7, A2:2, B2:6, A3:3, B3:5, A4:4, B4:4, A5:5, B5:3, A6:6, B6:2, A7:7, B7:1, Rest/bytes>>, Acc) -><br>unpack3(<<>>, Rest, <<Acc/bytes, 0:1, B1:7, 0:1, B2:6, A1:1, 0:1, B3:5, A2:2, 0:1, B4:4, A3:3, 0:1, B5:3, A4:4, 0:1, B6:2, A5:5, 0:1, B7:1, A6:6, 0:1, A7:7>>);<br>
unpack3(<<>>, <<A:1, B:7, Rest/bytes>>, Acc) -> unpack3(<<A:1>>, Rest, <<Acc/bytes, 0:1, B:7>>);<br>unpack3(<<P:1>>, <<A:2, B:6, Rest/bytes>>, Acc) -> unpack3(<<A:2>>, Rest, <<Acc/bytes, 0:1, B:6, P:1>>);<br>
unpack3(<<P:2>>, <<A:3, B:5, Rest/bytes>>, Acc) -> unpack3(<<A:3>>, Rest, <<Acc/bytes, 0:1, B:5, P:2>>);<br>unpack3(<<P:3>>, <<A:4, B:4, Rest/bytes>>, Acc) -> unpack3(<<A:4>>, Rest, <<Acc/bytes, 0:1, B:4, P:3>>);<br>
unpack3(<<P:4>>, <<A:5, B:3, Rest/bytes>>, Acc) -> unpack3(<<A:5>>, Rest, <<Acc/bytes, 0:1, B:3, P:4>>);<br>unpack3(<<P:5>>, <<A:6, B:2, Rest/bytes>>, Acc) -> unpack3(<<A:6>>, Rest, <<Acc/bytes, 0:1, B:2, P:5>>);<br>
unpack3(<<P:6>>, <<A:7, B:1, Rest/bytes>>, Acc) -> unpack3(<<>>, Rest, <<Acc/bytes, 0:1, B:1, P:6, 0:1, A:7>>).<br><br><br><div class="gmail_quote">On Thu, Mar 5, 2009 at 4:44 PM, Hynek Vychodil <span dir="ltr"><<a href="mailto:vychodil.hynek@gmail.com">vychodil.hynek@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Well, GSM using weird coding.<br>This similar to your solution is:<br><br>unpack(UD) -><br>
    << <<0:1,A:1,B:1,C:1,D:1,E:1,F:1,G:1>> ||<br>        <<G:1,F:1,E:1,D:1,C:1,B:1,A:1>> <=<br>
            << <<A:1,B:1,C:1,D:1,E:1,F:1,G:1,H:1>> || <<H:1,G:1,F:1,E:1,D:1,C:1,B:1,A:1>> <= UD >><br>    >>.<br><br>It is 2-10 times faster on my laptop (depend of GC hit) in byte code and 4 times in native.<div>
<div></div><div class="h5"><br>
<br><div class="gmail_quote">2009/3/5 Tony Seebregts <span dir="ltr"><<a href="mailto:tony.seebregts@gmail.com" target="_blank">tony.seebregts@gmail.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<div><span style="border-collapse: collapse;">Hmmm , the short answer is that the code I suggested is taken from a module to convert a GSM octet stream into a septet stream and it gives a different answer when using your more compact code :-) :<div>


<br></div><div><div>UD:      << 203,176,184,204,86,191,1 >></div><div>Mine:    [75,97,98,101,108,106,111,0]<br></div><div>Yours:  << 101,108,23,12,98,90,126,1>><br></div><div><br></div><div>I remember the GSM octet-septet conversion being quite awkward to get right because the bytes were the 'wrong way round'  which is probably why I ended up with the code I did i.e. having to use flip(...).</div>


<div><br></div></div></span><br></div><div class="gmail_quote"><div>2009/3/5 Hynek Vychodil <span dir="ltr"><<a href="mailto:vychodil.hynek@gmail.com" target="_blank">vychodil.hynek@gmail.com</a>></span><br>
</div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Why not?<div><div></div><div><br><br>unpack(UD) -><br>  << <<0:1,X/bits>> || <<X:7/bits>> <= UD >>.<br><br><div class="gmail_quote">2009/3/5 Tony Seebregts <span dir="ltr"><<a href="mailto:tony.seebregts@gmail.com" target="_blank">tony.seebregts@gmail.com</a>></span><br>



<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div>This is an extract from the code I use:<div><br></div><div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0px 0px 0px 0.8ex; padding-left: 1ex;">




<div>unpack(UD) -></div><div>   septets(list_to_binary([ flip(X) || X <- binary_to_list(UD) ])).</div><div><br></div><div>septets(T) -></div><div>    [ flipx(X) || <<X:7>> <= T].</div><div><br></div>




<div>% Flips the bits in an octet/septet for easy unpacking</div><div><br></div><div>flip(Octet) -></div><div>   <<B8:1,B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1>>  = <<Octet>>,</div><div>   <<B1:1,B2:1,B3:1,B4:1,B5:1,B6:1,B7:1,B8:1>>.</div>




</blockquote><div> </div><div>There is probably a better way of doing it but I was in a rush at the time :-)</div><div><br></div><div><br></div><div><br></div><div><br></div></div>
<br></div></div>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><font color="#888888"><br><br clear="all"><br>-- <br>--Hynek (Pichi) Vychodil<br>



<br>Analyze your data in minutes. Share your insights instantly. Thrill your boss.  Be a data hero!<br>Try Good Data now for free: <a href="http://www.gooddata.com" target="_blank">www.gooddata.com</a><br>
</font></div></div></blockquote></div><br>
<br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://www.erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://www.erlang.org/mailman/listinfo/erlang-questions</a><br></blockquote></div><br><br clear="all"><br>-- <br>--Hynek (Pichi) Vychodil<br>

<br>Analyze your data in minutes. Share your insights instantly. Thrill your boss.  Be a data hero!<br>Try Good Data now for free: <a href="http://www.gooddata.com" target="_blank">www.gooddata.com</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>--Hynek (Pichi) Vychodil<br><br>Analyze your data in minutes. Share your insights instantly. Thrill your boss.  Be a data hero!<br>Try Good Data now for free: <a href="http://www.gooddata.com">www.gooddata.com</a><br>