haar_lib/iter/
bit.rs

1//! `bit_ones`と`bit_zeros`を提供する。
2
3/// `bit_ones`と`bit_zeros`を提供する。
4pub trait EnumBit {
5    /// ビットが`1`である桁を昇順に列挙する。
6    fn bit_ones(self, n: usize) -> impl Iterator<Item = usize>;
7    /// ビットが`0`である桁を昇順に列挙する。
8    fn bit_zeros(self, n: usize) -> impl Iterator<Item = usize>;
9}
10
11macro_rules! implement {
12    ($($t:ty),*) => {
13        $(
14            impl EnumBit for $t {
15                fn bit_ones(self, n: usize) -> impl Iterator<Item = usize> {
16                    (0..n).filter(move |&i| self & (1 << i) != 0)
17                }
18                fn bit_zeros(self, n: usize) -> impl Iterator<Item = usize> {
19                    (0..n).filter(move |&i| self & (1 << i) == 0)
20                }
21            }
22        )*
23    }
24}
25
26implement!(u8, u16, u32, u64, u128, usize);
27
28#[cfg(test)]
29mod tests {
30    use crate::iter::collect::CollectVec;
31
32    use super::*;
33
34    #[test]
35    fn test() {
36        let a = 0b1001010010101_usize;
37        dbg!(a.bit_ones(64).collect_vec());
38
39        let a = 0b1001010010101_u64;
40        dbg!(a.bit_ones(64).collect_vec());
41
42        let a = 0b1001010010101_u32;
43        dbg!(a.bit_ones(32).collect_vec());
44        dbg!(a.bit_zeros(32).collect_vec());
45    }
46
47    #[test]
48    #[should_panic]
49    fn test_panic() {
50        let a = 0b1001010010101_u32;
51        dbg!(a.bit_ones(64).collect_vec());
52    }
53}