1 | //! Utilities to generate bitmasks. |
2 | |
3 | #![doc (hidden)] |
4 | |
5 | /// Generate a bitwise mask for the lower `n` bits. |
6 | /// |
7 | /// # Examples |
8 | /// |
9 | /// ```rust |
10 | /// # use minimal_lexical::mask::lower_n_mask; |
11 | /// # pub fn main() { |
12 | /// assert_eq!(lower_n_mask(2), 0b11); |
13 | /// # } |
14 | /// ``` |
15 | #[inline ] |
16 | pub fn lower_n_mask(n: u64) -> u64 { |
17 | debug_assert!(n <= 64, "lower_n_mask() overflow in shl." ); |
18 | |
19 | match n == 64 { |
20 | // u64::MAX for older Rustc versions. |
21 | true => 0xffff_ffff_ffff_ffff, |
22 | false => (1 << n) - 1, |
23 | } |
24 | } |
25 | |
26 | /// Calculate the halfway point for the lower `n` bits. |
27 | /// |
28 | /// # Examples |
29 | /// |
30 | /// ```rust |
31 | /// # use minimal_lexical::mask::lower_n_halfway; |
32 | /// # pub fn main() { |
33 | /// assert_eq!(lower_n_halfway(2), 0b10); |
34 | /// # } |
35 | /// ``` |
36 | #[inline ] |
37 | pub fn lower_n_halfway(n: u64) -> u64 { |
38 | debug_assert!(n <= 64, "lower_n_halfway() overflow in shl." ); |
39 | |
40 | match n == 0 { |
41 | true => 0, |
42 | false => nth_bit(n - 1), |
43 | } |
44 | } |
45 | |
46 | /// Calculate a scalar factor of 2 above the halfway point. |
47 | /// |
48 | /// # Examples |
49 | /// |
50 | /// ```rust |
51 | /// # use minimal_lexical::mask::nth_bit; |
52 | /// # pub fn main() { |
53 | /// assert_eq!(nth_bit(2), 0b100); |
54 | /// # } |
55 | /// ``` |
56 | #[inline ] |
57 | pub fn nth_bit(n: u64) -> u64 { |
58 | debug_assert!(n < 64, "nth_bit() overflow in shl." ); |
59 | 1 << n |
60 | } |
61 | |