Browse Source

utils: add bit_decompose

Lennart Braun 2 years ago
parent
commit
23c798a2b0
3 changed files with 34 additions and 0 deletions
  1. 1 0
      utils/Cargo.toml
  2. 32 0
      utils/src/bit_decompose.rs
  3. 1 0
      utils/src/lib.rs

+ 1 - 0
utils/Cargo.toml

@@ -7,4 +7,5 @@ edition = "2021"
 
 [dependencies]
 aes = "0.8.1"
+num = "0.4.0"
 rand = "0.8.5"

+ 32 - 0
utils/src/bit_decompose.rs

@@ -0,0 +1,32 @@
+use num::PrimInt;
+
+pub fn bit_decompose<T: PrimInt, U: From<bool>>(x: T, n_bits: usize) -> Vec<U> {
+    assert!(n_bits as u32 == T::zero().count_zeros() || x < T::one() << n_bits);
+    (0..n_bits)
+        .map(|i| (x & (T::one() << (n_bits - i - 1)) != T::zero()).into())
+        .collect()
+}
+
+#[cfg(test)]
+mod tests {
+    use super::*;
+
+    #[test]
+    fn test_bit_decompose() {
+        assert_eq!(
+            bit_decompose::<u32, u32>(0x42, 8),
+            vec![0, 1, 0, 0, 0, 0, 1, 0]
+        );
+        assert_eq!(
+            bit_decompose::<u32, u32>(0x42, 10),
+            vec![0, 0, 0, 1, 0, 0, 0, 0, 1, 0]
+        );
+        assert_eq!(
+            bit_decompose::<u32, u32>(0x46015ced, 32),
+            vec![
+                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,
+                1, 1, 0, 1,
+            ]
+        );
+    }
+}

+ 1 - 0
utils/src/lib.rs

@@ -1,2 +1,3 @@
+pub mod bit_decompose;
 pub mod fixed_key_aes;
 pub mod pseudorandom_conversion;