我试图像这样反转二进制:
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)
我不喜欢这段代码.你能否建议更好的方法来完成这个例行程序?
有点像你的rev_bits函数:
rev (<<>>, Acc) -> Acc;
rev (<<H:1/binary, Rest/binary>>, Acc) ->
rev(Rest, <<H/binary, Acc/binary>>).
Run Code Online (Sandbox Code Playgroud)
我相信二进制级联已经过优化,因此这应该非常快.
编辑:使用条款代替案例......结束.
更好的选择:
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倍.
| 归档时间: |
|
| 查看次数: |
1509 次 |
| 最近记录: |