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]
lower_n_mask(n: u64) -> u6416 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]
lower_n_halfway(n: u64) -> u6437 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]
nth_bit(n: u64) -> u6457 pub fn nth_bit(n: u64) -> u64 {
58 debug_assert!(n < 64, "nth_bit() overflow in shl.");
59 1 << n
60 }
61