//! Utilities to generate bitmasks. #![doc(hidden)] /// Generate a bitwise mask for the lower `n` bits. /// /// # Examples /// /// ```rust /// # use minimal_lexical::mask::lower_n_mask; /// # pub fn main() { /// assert_eq!(lower_n_mask(2), 0b11); /// # } /// ``` #[inline] pub fn lower_n_mask(n: u64) -> u64 { debug_assert!(n <= 64, "lower_n_mask() overflow in shl."); match n == 64 { // u64::MAX for older Rustc versions. true => 0xffff_ffff_ffff_ffff, false => (1 << n) - 1, } } /// Calculate the halfway point for the lower `n` bits. /// /// # Examples /// /// ```rust /// # use minimal_lexical::mask::lower_n_halfway; /// # pub fn main() { /// assert_eq!(lower_n_halfway(2), 0b10); /// # } /// ``` #[inline] pub fn lower_n_halfway(n: u64) -> u64 { debug_assert!(n <= 64, "lower_n_halfway() overflow in shl."); match n == 0 { true => 0, false => nth_bit(n - 1), } } /// Calculate a scalar factor of 2 above the halfway point. /// /// # Examples /// /// ```rust /// # use minimal_lexical::mask::nth_bit; /// # pub fn main() { /// assert_eq!(nth_bit(2), 0b100); /// # } /// ``` #[inline] pub fn nth_bit(n: u64) -> u64 { debug_assert!(n < 64, "nth_bit() overflow in shl."); 1 << n }