erlang 更好的二进制反转方法

omhiaaxx  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(149)

I'm trying to reverse binary like this:

reverse(Bin) ->
    list_to_binary(lists:reverse([rev_bits(<<B>>) || B <- binary:bin_to_list(Bin)])).

rev_bits(<<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>>.

I don't like this code. Could you please advise better way to accomplish this routine?

ctrmrzij

ctrmrzij1#

有点像rev_bits函数:

rev (<<>>, Acc) -> Acc;
rev (<<H:1/binary, Rest/binary>>, Acc) ->
    rev(Rest, <<H/binary, Acc/binary>>).

我相信二进制级联是优化的,所以这应该是相当快了。
编辑:使用子句代替case ... of ... end。

lmvvr0a8

lmvvr0a82#

    • 更好的选择:**
rev(Binary) ->

   Size = erlang:size(Binary)*8,
   <<X:Size/integer-little>> = Binary,
   <<X:Size/integer-big>>.

与fenollp迭代方法进行比较的基准测试结果。基准测试是使用包含8192个随机字节的随机二进制文件调用两个函数完成的:

    • 呼叫反向10次**

基准测试我的方法:调用reverse/1函数10次.过程耗时0.000299秒BENCHMARK fenollp迭代法:调用reverse_recursive/1函数10次。过程耗时0.058528秒

    • 呼叫反向100次**

基准测试我的方法:调用reverse/1函数100次.过程耗时0.002703秒BENCHMARK fenollp迭代法:调用reverse_recursive/1函数100次。过程耗时0.391098秒
我提出的方法通常至少快100倍。

inb24sb2

inb24sb23#

binary:encode_unsigned(binary:decode_unsigned(Bin, little)).

相关问题