cnfy-uint 0.2.3

Zero-dependency 256-bit unsigned integer arithmetic for cryptographic applications
Documentation
//! Even parity check for [`U512`] values.
use super::U512;

impl U512 {
    /// Returns `true` if the least significant bit is clear (the value is even).
    ///
    /// # Examples
    ///
    /// ```
    /// use cnfy_uint::u512::U512;
    ///
    /// assert!(U512::ZERO.is_even());
    /// assert!(!U512::ONE.is_even());
    /// assert!(U512::from_be_limbs([0, 0, 0, 0, 0, 0, 0, 2]).is_even());
    /// ```
    #[inline]
    pub fn is_even(&self) -> bool {
        self.0[0] & 1 == 0
    }
}

#[cfg(test)]
mod ai_tests {
    use super::*;

    /// Zero is even.
    #[test]
    fn zero() {
        assert!(U512::ZERO.is_even());
    }

    /// One is not even.
    #[test]
    fn one() {
        assert!(!U512::ONE.is_even());
    }

    /// Two is even.
    #[test]
    fn two() {
        assert!(U512::from_be_limbs([0, 0, 0, 0, 0, 0, 0, 2]).is_even());
    }

    /// MAX is not even.
    #[test]
    fn max() {
        assert!(!U512::MAX.is_even());
    }

    /// is_even is the complement of is_odd.
    #[test]
    fn complement_of_is_odd() {
        let cases = [
            U512::ZERO,
            U512::ONE,
            U512::MAX,
            U512::from_be_limbs([0x8000_0000_0000_0000, 0, 0, 0, 0, 0, 0, 0]),
        ];
        for v in &cases {
            assert_eq!(v.is_even(), !v.is_odd());
        }
    }
}