pub fn pack_bits(values: &[u32], width: u32) -> Vec<u8> {
let total_bits = values.len() * width as usize;
let mut out = vec![0u8; total_bits.div_ceil(8)];
let mut bit_pos = 0usize;
for &value in values {
for b in (0..width).rev() {
if (value >> b) & 1 == 1 {
out[bit_pos / 8] |= 1 << (7 - (bit_pos % 8));
}
bit_pos += 1;
}
}
out
}
#[cfg(test)]
mod tests {
use crate::pack_bits;
#[test]
fn bitmap_example() {
assert_eq!(pack_bits(&[1, 1, 1, 1], 1), vec![0xF0]);
}
#[test]
fn packed_channel_examples() {
assert_eq!(pack_bits(&[0, 0, 0, 1], 1), vec![0x10]);
assert_eq!(pack_bits(&[0, 1, 1, 1], 1), vec![0x70]);
}
#[test]
fn multi_bit_width() {
assert_eq!(pack_bits(&[5, 2], 3), vec![0b1010_1000]);
}
}