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

Rust中如何将bool数组转换为长度为原长1/8的u8字节数组

bool数组转1/8长度字节数组的实现方法

Rust标准库没有提供固定长度bool数组直接转位压缩字节数组的内置API,除了基础循环写法之外,以下是几种实用的实现方式,都能满足你示例中160个bool转20个u8的需求:

  • 无依赖纯安全实现(推荐绝大多数场景使用)
    本质是迭代器+位运算,逻辑直白,编译器可以把这段代码优化到极致性能,没有额外开销:
const LEN_IN: usize = 160;
const LEN_OUT: usize = LEN_IN / 8;

fn bool_arr_to_u8_arr(bools: &[bool; LEN_IN]) -> [u8; LEN_OUT] {
    let mut out = [0u8; LEN_OUT];
    for (idx, &flag) in bools.iter().enumerate() {
        if flag {
            out[idx / 8] |= 1 << (idx % 8);
        }
    }
    out
}

// 对应你的示例调用
let a = [false; 160];
let b: [u8; 20] = bool_arr_to_u8_arr(&a);

如果需要调整位序,比如让数组靠前的bool对应字节的高位,只需要把移位逻辑改成1 << (7 - idx % 8)即可。

  • 极致性能的unsafe实现(非必要不推荐)
    Rust标准库明确保证bool类型的内存布局为1字节,true对应值为1、false对应值为0,你可以直接按8个一组读取内存做压缩,不过这种写法需要额外注意大小端、对齐问题,常规业务场景下和安全实现的性能差距几乎感知不到,没必要特意使用。

注意点

  • 使用前要确保输入bool数组的长度是8的整数倍,否则无法得到恰好1/8长度的输出,你的示例中160是8的20倍,刚好符合要求。
  • 不需要特意找花里胡哨的"简写"方式,位压缩逻辑本身非常简单,直白的循环写法可读性、可维护性都是最高的。

内容的提问来源于stack exchange,提问作者Thorkil Værge

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:03:20