bit_decompose.rs 1002 B

1234567891011121314151617181920212223242526272829303132333435
  1. //! Functionality to compute the bit decomposition of integers.
  2. use num::PrimInt;
  3. /// Decompose an integer `x` into a vector of its bits.
  4. pub fn bit_decompose<T: PrimInt, U: From<bool>>(x: T, n_bits: usize) -> Vec<U> {
  5. assert!(n_bits as u32 == T::zero().count_zeros() || x < T::one() << n_bits);
  6. (0..n_bits)
  7. .map(|i| (x & (T::one() << (n_bits - i - 1)) != T::zero()).into())
  8. .collect()
  9. }
  10. #[cfg(test)]
  11. mod tests {
  12. use super::*;
  13. #[test]
  14. fn test_bit_decompose() {
  15. assert_eq!(
  16. bit_decompose::<u32, u32>(0x42, 8),
  17. vec![0, 1, 0, 0, 0, 0, 1, 0]
  18. );
  19. assert_eq!(
  20. bit_decompose::<u32, u32>(0x42, 10),
  21. vec![0, 0, 0, 1, 0, 0, 0, 0, 1, 0]
  22. );
  23. assert_eq!(
  24. bit_decompose::<u32, u32>(0x46015ced, 32),
  25. vec![
  26. 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,
  27. 1, 1, 0, 1,
  28. ]
  29. );
  30. }
  31. }