use super::U512;
impl U512 {
#[inline]
pub const fn trailing_zeros(&self) -> u32 {
if self.0[0] != 0 {
self.0[0].trailing_zeros()
} else if self.0[1] != 0 {
64 + self.0[1].trailing_zeros()
} else if self.0[2] != 0 {
128 + self.0[2].trailing_zeros()
} else if self.0[3] != 0 {
192 + self.0[3].trailing_zeros()
} else if self.0[4] != 0 {
256 + self.0[4].trailing_zeros()
} else if self.0[5] != 0 {
320 + self.0[5].trailing_zeros()
} else if self.0[6] != 0 {
384 + self.0[6].trailing_zeros()
} else if self.0[7] != 0 {
448 + self.0[7].trailing_zeros()
} else {
512
}
}
}
#[cfg(test)]
mod ai_tests {
use super::*;
#[test]
fn zero() {
assert_eq!(U512::ZERO.trailing_zeros(), 512);
}
#[test]
fn one() {
assert_eq!(U512::ONE.trailing_zeros(), 0);
}
#[test]
fn max() {
assert_eq!(U512::MAX.trailing_zeros(), 0);
}
#[test]
fn powers_of_two() {
assert_eq!(U512::from_be_limbs([0, 0, 0, 0, 0, 0, 0, 2]).trailing_zeros(), 1);
assert_eq!(U512::from_be_limbs([0, 0, 0, 0, 0, 0, 0, 8]).trailing_zeros(), 3);
assert_eq!(U512::from_be_limbs([0, 0, 0, 0, 0, 0, 1, 0]).trailing_zeros(), 64);
assert_eq!(U512::from_be_limbs([0, 0, 0, 0, 0, 1, 0, 0]).trailing_zeros(), 128);
assert_eq!(U512::from_be_limbs([0, 0, 0, 0, 1, 0, 0, 0]).trailing_zeros(), 192);
assert_eq!(U512::from_be_limbs([0, 0, 0, 1, 0, 0, 0, 0]).trailing_zeros(), 256);
assert_eq!(U512::from_be_limbs([0, 0, 1, 0, 0, 0, 0, 0]).trailing_zeros(), 320);
assert_eq!(U512::from_be_limbs([0, 1, 0, 0, 0, 0, 0, 0]).trailing_zeros(), 384);
assert_eq!(U512::from_be_limbs([1, 0, 0, 0, 0, 0, 0, 0]).trailing_zeros(), 448);
}
#[test]
fn msb_only() {
assert_eq!(
U512::from_be_limbs([0x8000000000000000, 0, 0, 0, 0, 0, 0, 0]).trailing_zeros(),
511,
);
}
#[test]
fn odd_values() {
assert_eq!(U512::from_be_limbs([0, 0, 0, 0, 0, 0, 0, 3]).trailing_zeros(), 0);
assert_eq!(U512::from_be_limbs([0xFF, 0, 0, 0, 0, 0, 0, 1]).trailing_zeros(), 0);
}
}