5
執行以下操作的最佳方法是?二進制 - >列表 - >二進制似乎沒有必要。Erlang二進制文件的二進制操作?
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) ->
A2 = binary_to_list(A),
B2 = binary_to_list(B),
list_to_binary([U band V || {U, V} <- lists:zip(A2, B2)]).
如果不關心性能,您的代碼是絕對沒問題的。否則你可以做一些不同的事情。
例如二郎支持任意大小的整數:
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.
無論如何,你必須衡量你是否真的對錶現感興趣。可能是第一個是你的目的最快的。
如果你想看到的陰暗面的力量...
binary_and(A, B) ->
Size = erlang:byte_size(A),
Size = erlang:byte_size(B),
Res = hipe_bifs:bytearray(Size, 0),
binary_and(Res, A, B, 0, Size).
binary_and(Res, _A, _B, Size, Size) ->
Res.
binary_and(Res, A, B, N, Size) ->
Bin = hipe_bifs:bytearray_sub(A, N) band hipe_bifs:bytearray_sub(B,N),
hipe_bifs:bytearray_update(Res, N, Bin),
binary_and(Res, A, B, N+1, Size).
編譯得到二進制使用優化的一些提示時,使用'bin_opt_info'選項。詳情請參閱編譯手冊。 – Zed 2009-12-17 10:34:02