更好的方法来反转二进制

时间:2013-12-29 21:21:56

标签: 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>>.

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

3 个答案:

答案 0 :(得分:9)

有点像你的rev_bits函数:

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

我认为二进制级联已经过优化,所以这应该已经非常快了。

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

答案 1 :(得分:6)

更好的选择:

rev(Binary) ->

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

与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倍。

答案 2 :(得分:1)

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