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
相关产品推荐
相关产品推荐

