You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

为什么这个方案更好?

咱们拆解一下步骤,就能明白它比你的原函数更优雅:

  1. 分组比特:用Enum.chunk_every(bit_list, 8)把原列表按每8个元素一组拆分——因为题目保证长度是8的倍数,所以不会有剩余的零散元素。
  2. 比特转字节:对每个8元素的子列表,用Enum.reduce计算对应的十进制字节值:初始值为0,每一步把当前结果左移一位(等价于乘2)再加上当前比特,这样就把从高位到低位的比特序列转成了0-255之间的字节整数。
  3. 字节列表转二进制:最后用: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:54:53