Elixir:如何将比特列表转换为二进制?
嘿,我完全懂你的需求——把由整数表示的比特列表(比如[1,0,0,1,1,0,0,1,0,0,0,1,1,1,0,0])转换成对应的二进制,而且已经明确列表长度是8的倍数。你自己写的递归函数确实有点繁琐,其实Elixir里有更简洁、易读的实现方式,咱们来看看怎么优化:
优化后的实现
def list_to_binary(bit_list) do bit_list |> Enum.chunk_every(8) |> Enum.map(fn chunk -> Enum.reduce(chunk, 0, &(&2 * 2 + &1)) end) |> :binary.list_to_bin() end
为什么这个方案更好?
咱们拆解一下步骤,就能明白它比你的原函数更优雅:
- 分组比特:用
Enum.chunk_every(bit_list, 8)把原列表按每8个元素一组拆分——因为题目保证长度是8的倍数,所以不会有剩余的零散元素。 - 比特转字节:对每个8元素的子列表,用
Enum.reduce计算对应的十进制字节值:初始值为0,每一步把当前结果左移一位(等价于乘2)再加上当前比特,这样就把从高位到低位的比特序列转成了0-255之间的字节整数。 - 字节列表转二进制:最后用
:binary.list_to_bin/1这个Erlang内置函数,直接把字节整数列表转换成二进制,一步到位。
验证效果
用你给出的例子测试:
输入列表[1,0,0,1,1,0,0,1,0,0,0,1,1,1,0,0]会被拆分为[[1,0,0,1,1,0,0,1], [0,0,0,1,1,1,0,0]],第一个分组计算得到153,第二个得到28,最终输出就是<<153, 28>>,完全符合你的预期。
这个实现不仅代码更短、可读性更强,还利用了Elixir/Erlang内置的优化函数,效率也比手动递归处理更高~
内容的提问来源于stack exchange,提问作者jakobht
相关产品推荐
相关产品推荐

