utils.rs 881 B

1234567891011121314151617181920212223242526272829303132
  1. use num::PrimInt;
  2. pub fn bit_decompose<T: PrimInt, U: From<bool>>(x: T, n_bits: usize) -> Vec<U> {
  3. assert!(n_bits as u32 == T::zero().count_zeros() || x < T::one() << n_bits);
  4. (0..n_bits)
  5. .map(|i| (x & (T::one() << (n_bits - i - 1)) != T::zero()).into())
  6. .collect()
  7. }
  8. #[cfg(test)]
  9. mod tests {
  10. use super::*;
  11. #[test]
  12. fn test_bit_decompose() {
  13. assert_eq!(
  14. bit_decompose::<u32, u32>(0x42, 8),
  15. vec![0, 1, 0, 0, 0, 0, 1, 0]
  16. );
  17. assert_eq!(
  18. bit_decompose::<u32, u32>(0x42, 10),
  19. vec![0, 0, 0, 1, 0, 0, 0, 0, 1, 0]
  20. );
  21. assert_eq!(
  22. bit_decompose::<u32, u32>(0x46015ced, 32),
  23. vec![
  24. 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0,
  25. 1, 1, 0, 1,
  26. ]
  27. );
  28. }
  29. }