Erlang 如何加入位字符串列表?

Erlang 如何加入位字符串列表?,erlang,Erlang,具有位字符串列表时,需要加入单个位字符串: join(Bs) -> F = fun(B, Bt) -> <<B/bitstring, Bt/bitstring>> end, lists:foldr(F, <<>>, Bs). join(Bs)-> F=乐趣(B,Bt)->结束, 列表:foldr(F,Bs)。 您能建议更快的方法吗?您可以使用二进制理解: join(Bs) = << <<B/b

具有位字符串列表时,需要加入单个位字符串:

join(Bs) ->
    F = fun(B, Bt) -> <<B/bitstring, Bt/bitstring>> end,
    lists:foldr(F, <<>>, Bs).
join(Bs)->
F=乐趣(B,Bt)->结束,
列表:foldr(F,Bs)。

您能建议更快的方法吗?

您可以使用二进制理解:

join(Bs) = << <<B/bits>> || B <- Bs >>.
join(Bs)=。
例如,在shell中尝试以下操作:

1> <<N:16>> = << <<B/bits>> || B <- [<<1:4>>, <<2:4>>, <<3:4>>, <<4:4>>] >>.
<<18,52>>
2> io:format("~.16#~n", [N]).
16#1234
1>=。
2> io:格式(“~.16#~n”,[n])。
16#1234

您可能应该阅读IO列表。下面是一篇关于这个主题的好博客: 我不知道你在做什么,但大多数时候你可以跳过加入二进制文件。当然,如果您确实需要,您仍然可以这样做:

5> iolist_to_binary([<<"a">>, <<"b">>, <<"c">>]).
<<"abc">>
5>iolist\u到\u二进制([,])。
如果某些元素是字符串或字符,它也会起作用:

9> iolist_to_binary([<<"a">>, <<"b">>, "c", $d]).
<<"abcd">>
9>iolist_to_binary([,“c”,“$d])。
虽然答案很完美,但我想补充一点。与列表不同的是,当您加入二进制文件时,您应该更喜欢从头开始(请参阅),否则最终会出现二次行为。因此,您可以将代码重写为

join(Bs) ->
    F = fun(B, Bt) -> <<Bt/bits, B/bits>> end,
    lists:foldl(F, <<>>, Bs).
join(Bs)->
F=乐趣(B,Bt)->结束,
列表:foldl(F,Bs)。
这几乎和bits理解一样有效。无论如何,bits理解更简单有效

join(Bs) -> << <<B/bits>> || B <- Bs >>.
join(Bs)->。

谢谢,这是一个非常有用的功能。感谢您提供该文章的链接!