1use std::cmp::max;
2
3pub fn get_u32_bit_count(value: u32) -> u32 {
4 32 - value.leading_zeros()
5}
6
7pub fn get_i32_bit_count(value: i32) -> u32 {
8 match value {
9 0 => 0,
10 v if v < 0 => 33 - (!v).leading_zeros(),
11 v => 33 - v.leading_zeros()
12 }
13}
14
15pub fn get_u32_min_bit_count<I: Iterator<Item = u32>>(values: I) -> u32 {
16 values.map(get_u32_bit_count).fold(0, max)
17}
18
19pub fn get_i32_min_bit_count<I: Iterator<Item = i32>>(values: I) -> u32 {
20 values.map(get_i32_bit_count).fold(0, max)
21}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26
27 #[test]
28 fn test_get_u32_bit_count() {
29 assert_eq!(get_u32_bit_count(0), 0);
30 assert_eq!(get_u32_bit_count(1), 1);
31 assert_eq!(get_u32_bit_count(2), 2);
32 assert_eq!(get_u32_bit_count(3), 2);
33 assert_eq!(get_u32_bit_count(4), 3);
34 assert_eq!(get_u32_bit_count(5), 3);
35 assert_eq!(get_u32_bit_count(7), 3);
36 assert_eq!(get_u32_bit_count(8), 4);
37 assert_eq!(get_u32_bit_count(15), 4);
38 assert_eq!(get_u32_bit_count(16), 5);
39 assert_eq!(get_u32_bit_count(2147483647), 31);
40 }
41
42 #[test]
43 fn test_get_i32_bit_count() {
44 assert_eq!(get_i32_bit_count(0), 0);
45 assert_eq!(get_i32_bit_count(1), 2);
46 assert_eq!(get_i32_bit_count(2), 3);
47 assert_eq!(get_i32_bit_count(3), 3);
48 assert_eq!(get_i32_bit_count(4), 4);
49 assert_eq!(get_i32_bit_count(5), 4);
50 assert_eq!(get_i32_bit_count(7), 4);
51 assert_eq!(get_i32_bit_count(8), 5);
52 assert_eq!(get_i32_bit_count(15), 5);
53 assert_eq!(get_i32_bit_count(16), 6);
54 assert_eq!(get_i32_bit_count(2147483647), 32);
55 assert_eq!(get_i32_bit_count(-1), 1);
56 assert_eq!(get_i32_bit_count(-2), 2);
57 assert_eq!(get_i32_bit_count(-3), 3);
58 assert_eq!(get_i32_bit_count(-4), 3);
59 assert_eq!(get_i32_bit_count(-5), 4);
60 assert_eq!(get_i32_bit_count(-2147483648), 32);
61 }
62
63 #[test]
64 fn test_get_u32_min_bit_count() {
65 assert_eq!(get_u32_min_bit_count(vec![].into_iter()), 0);
66 assert_eq!(get_u32_min_bit_count(vec![0].into_iter()), 0);
67 assert_eq!(get_u32_min_bit_count(vec![0, 0].into_iter()), 0);
68 assert_eq!(get_u32_min_bit_count(vec![1].into_iter()), 1);
69 assert_eq!(get_u32_min_bit_count(vec![1, 1].into_iter()), 1);
70 assert_eq!(get_u32_min_bit_count(vec![0, 1].into_iter()), 1);
71 assert_eq!(get_u32_min_bit_count(vec![1, 0].into_iter()), 1);
72 assert_eq!(get_u32_min_bit_count(vec![0, 0, 2, 3].into_iter()), 2);
73 assert_eq!(get_u32_min_bit_count(vec![4, 0, 2, 3].into_iter()), 3);
74 assert_eq!(get_u32_min_bit_count(vec![2, 1, 2].into_iter()), 2);
75 assert_eq!(get_u32_min_bit_count(vec![2147483647, 3, 0, 1000].into_iter()), 31);
76 }
77
78 #[test]
79 fn test_get_i32_min_bit_count() {
80 assert_eq!(get_i32_min_bit_count(vec![].into_iter()), 0);
81 assert_eq!(get_i32_min_bit_count(vec![0].into_iter()), 0);
82 assert_eq!(get_i32_min_bit_count(vec![-1].into_iter()), 1);
83 assert_eq!(get_i32_min_bit_count(vec![0, -1].into_iter()), 1);
84 assert_eq!(get_i32_min_bit_count(vec![-1, 0].into_iter()), 1);
85 assert_eq!(get_i32_min_bit_count(vec![16, 0, -5].into_iter()), 6);
86 assert_eq!(get_i32_min_bit_count(vec![2147483647, -2147483648].into_iter()), 32);
87 }
88}