// complement all used bits of mpz // complement sign of mpz // z is always != 0 void _dcom (mpz_t z) { mp_bitcnt_t msb = mpz_sizeinbase (z, 2); mp_limb_t *d = z->_mp_d; mp_limb_t *e = d + msb / mp_bits_per_limb; while (d <= e) { *(d++) = ~(*d); } *(--d) ^= 0xFFFFFFFFFFFFFFFFUL << (msb % mp_bits_per_limb); for (d = z->_mp_d; d <= e; e--) { if (*e) break; } z->_mp_size = (z->_mp_size < 0) ? e-d+1 : -(e-d+1); }