erlang - Erlang 二进制文件上的二元运算?

标签 erlang binary

执行以下操作的最佳方法是什么?二进制 -> 列表 -> 二进制似乎没有必要。

binary_and(A, B) ->
    A2 = binary_to_list(A),
    B2 = binary_to_list(B),
    list_to_binary([U band V || {U, V} <- lists:zip(A2, B2)]).

最佳答案

如果不关心性能,你的代码绝对没问题。否则你可以做一些不同的事情。

例如,Erlang 支持任意大小的整数:

binary_and(A, B) ->
  Size = bit_size(A),
  <<X:Size>> = A,
  <<Y:Size>> = B,
  <<(X band Y):Size>>.

或者您可以手工制作自己的二进制压缩例程:

binary_and(A,B) -> binary_and(A, B, <<>>).

binary_and(<<A:8, RestA/bytes>>, <<B:8, RestB/bytes>>, Acc) ->
  binary_add(RestA, RestB, <<Acc/bytes, (A band B):8>>);
binary_and(<<>>, <<>>, Result) -> Result.

或优化版本:

binary_and(A,B) -> binary_and(A, B, <<>>).

binary_and(<<A:64, RestA/bytes>>, <<B:64, RestB/bytes>>, Acc) ->
  binary_add(RestA, RestB, <<Acc/bytes, (A band B):64>>);
binary_and(<<A:8, RestA/bytes>>, <<B:8, RestB/bytes>>, Acc) ->
  binary_add(RestA, RestB, <<Acc/bytes, (A band B):8>>);
binary_and(<<>>, <<>>, Result) -> Result.

或更复杂

binary_and(A,B) -> binary_and({A, B}, 0, <<>>).

binary_and(Bins, Index, Acc) ->
  case Bins of
    {<<_:Index/bytes, A:64, _/bytes>>, <<_:Index/bytes, B:64, _/bytes>>} ->
      binary_add(Bins, Index+8, <<Acc/bytes, (A band B):64>>);
    {<<_:Index/bytes, A:8, _/bytes>>, <<_:Index/bytes, B:8, _/bytes>>} ->
      binary_add(Bins, Index+1, <<Acc/bytes, (A band B):8>>);
    {<<_:Index/bytes>>, <<_:Index/bytes>>} -> Acc
  end.

无论如何,您必须衡量您是否真的对性能感兴趣。对于您的目的来说,第一个可能是最快的。

关于erlang - Erlang 二进制文件上的二元运算?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1919594/

相关文章:

web-services - gen_tcp获得极高的CPU

erlang - 如何更新ets bag中的数据?

erlang - 访问二进制中的变量位位置 - Erlang

javascript - Couch DB 中的 Erlang View

java - 在Java中用带符号的二进制数执行二进制加法和减法

Java .bin 文件被写入标准 .txt 文件

Erlang,特定 map 键上的模式匹配?

c - 在这个 if 条件下我要问什么?

c - 逐行读取文件并在c中进行比较

java - 尝试创建一个二分搜索平方根计算器,每次都收到 0 结果