1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
use word::Word; /// Number of set bits in `x` mod 2; i.e. 1 if the /// number of set bits in `x` is odd, zero otherwise /// /// # Intrinsics: /// -gcc/llvm: `__builtin_parity(x)`. /// /// # Examples /// /// ``` /// use bitwise::word::*; /// /// let n0 = 0b0000; // 0 -> even => parity = 0 /// let n1 = 0b0001; // 1 -> odd => partiy = 1 /// let n2 = 0b0010; // 1 -> odd => parity = 1 /// let n3 = 0b0011; // 2 -> even => parity = 0 /// /// assert_eq!(n0.parity(), 0); /// assert_eq!(n1.parity(), 1); /// assert_eq!(n2.parity(), 1); /// assert_eq!(n3.parity(), 0); /// assert_eq!(parity(n2), 1); /// ``` #[inline] pub fn parity<T: Word>(x: T) -> T { x.count_ones() & T::one() } /// Method version of [`parity`](fn.parity.html). pub trait Parity { #[inline] fn parity(self) -> Self; } impl<T: Word> Parity for T { #[inline] fn parity(self) -> Self { parity(self) } }