更好的方法来反转二进制

tar*_*aro 3 erlang

我试图像这样反转二进制:

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>>.
Run Code Online (Sandbox Code Playgroud)

我不喜欢这段代码.你能否建议更好的方法来完成这个例行程序?

fen*_*llp 8

有点像你的rev_bits函数:

rev (<<>>, Acc) -> Acc;
rev (<<H:1/binary, Rest/binary>>, Acc) ->
    rev(Rest, <<H/binary, Acc/binary>>).
Run Code Online (Sandbox Code Playgroud)

我相信二进制级联已经过优化,因此这应该非常快.

编辑:使用条款代替案例......结束.


Gri*_*lin 6

更好的选择:

rev(Binary) ->

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

与fenollp迭代法比较的基准结果.完成基准测试时,使用包含8192个随机字节的随机二进制调用这两个函数:

拨打反向10次

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

拨打反向100次

BENCHMARK我的方法:调用reverse/1函数100次.过程耗时0.002703秒BENCHMARK fenollp迭代方法:调用reverse_recursive/1函数100次.过程耗时0.391098秒

我提出的方法通常至少快100倍.