yttria_coding/
graycode.rs

1pub fn generate_gray_code(n_bits: u8) -> Vec<u8> {
2    assert!(n_bits > 0);
3
4    if n_bits == 1 {
5        vec![0u8, 1]
6    } else {
7        let last_code = generate_gray_code(n_bits - 1);
8
9        let mut last_code_reversed = last_code.clone();
10        last_code_reversed.reverse();
11
12        for i in last_code_reversed.iter_mut() {
13            *i |= 1 << (n_bits - 1);
14        }
15
16        [last_code, last_code_reversed].concat()
17    }
18}
19
20#[cfg(test)]
21mod tests {
22    use super::*;
23
24    #[test]
25    fn test_gray_codes() {
26        let code = generate_gray_code(1);
27        println!("{code:?}");
28
29        let code = generate_gray_code(2);
30        println!("{code:?}");
31
32        let code = generate_gray_code(3);
33        println!("{code:?}");
34    }
35}