haar_lib/algo/enum_bit/
subset_desc.rs

1//! ビット列の部分集合を降順に列挙する
2use std::iter::successors;
3
4/// ビット列としての`a`の部分集合を降順に列挙するイテレータを返す。
5pub fn subset_desc(a: u32) -> impl Iterator<Item = u32> {
6    successors(Some(a), move |&t| t.checked_sub(1).map(|x| x & a))
7}
8
9#[cfg(test)]
10mod tests {
11    use super::*;
12    use test_case::test_case;
13
14    #[test_case(0b11111111)]
15    #[test_case(0b00000000)]
16    #[test_case(0b10101010)]
17    #[test_case(0b00000001)]
18    #[test_case(0b10000000)]
19    #[test_case(0b10000001)]
20    #[test_case(0b11011011)]
21    fn check(x: u32) {
22        let a = (0..=x).rev().filter(|i| (!x & i) == 0).collect::<Vec<_>>();
23
24        let b = subset_desc(x).collect::<Vec<_>>();
25
26        assert_eq!(a, b);
27    }
28}