use crate::Float;
use crate::InnerFloat::Finite;
use malachite_base::num::arithmetic::traits::IsPowerOf2;
use malachite_base::num::basic::signeds::PrimitiveSigned;
use malachite_nz::natural::LIMB_HIGH_BIT;
impl IsPowerOf2 for Float {
fn is_power_of_2(&self) -> bool {
match self {
Self(Finite {
sign: true,
significand,
..
}) => {
let mut first = true;
for x in significand.limbs().rev() {
if first {
if x != LIMB_HIGH_BIT {
return false;
}
first = false;
} else if x != 0 {
return false;
}
}
true
}
_ => false,
}
}
}
pub(crate) fn abs_is_power_of_2(x: &Float) -> bool {
match x {
Float(Finite { significand, .. }) => {
let mut first = true;
for x in significand.limbs().rev() {
if first {
if x != LIMB_HIGH_BIT {
return false;
}
first = false;
} else if x != 0 {
return false;
}
}
true
}
_ => false,
}
}
pub(crate) fn float_is_signed_min<T: PrimitiveSigned>(f: &Float) -> bool {
match f {
Float(Finite {
sign: false,
exponent,
significand,
..
}) => {
if *exponent != T::WIDTH as i32 {
return false;
}
let mut first = true;
for x in significand.limbs().rev() {
if first {
if x != LIMB_HIGH_BIT {
return false;
}
first = false;
} else if x != 0 {
return false;
}
}
true
}
_ => false,
}
}