use crate::integer::Z;
use flint_sys::fmpz::fmpz_complement;
impl Z {
pub fn bit_complement(&self) -> Self {
let mut out = Z::default();
unsafe { fmpz_complement(&mut out.value, &self.value) };
out
}
}
#[cfg(test)]
mod test_bitxor {
use super::Z;
#[test]
fn small_numbers() {
let value_0 = Z::from(12);
let value_1 = Z::from(567);
let com_0 = value_0.bit_complement();
let com_1 = value_1.bit_complement();
let comcom_0 = com_0.bit_complement();
let comcom_1 = com_1.bit_complement();
assert_eq!(Z::from(-13), com_0);
assert_eq!(Z::from(-568), com_1);
assert_eq!(value_0, comcom_0);
assert_eq!(value_1, comcom_1);
}
#[test]
fn large_numbers() {
let value_0 = Z::from(i64::MAX);
let value_1 = Z::from(i64::MIN);
let com_0 = value_0.bit_complement();
let com_1 = value_1.bit_complement();
let comcom_0 = com_0.bit_complement();
let comcom_1 = com_1.bit_complement();
assert_eq!(Z::from(i64::MIN), com_0);
assert_eq!(Z::from(i64::MAX), com_1);
assert_eq!(value_0, comcom_0);
assert_eq!(value_1, comcom_1);
}
}