1pub trait EnumBit {
5 fn bit_ones(self, n: usize) -> impl Iterator<Item = usize>;
7 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}