CODE
typedef UINT_PTR ucell;
const ucell MAXUVALUE = MAXUINT_PTR;
struct udcell {
ucell lo, hi;
udcell() = default;
constexpr udcell(ucell lo, ucell hi) : lo(lo), hi(hi) {}
};
bool mixed_divmod(udcell dividend, ucell divisor, udcell "ient, ucell &remainder)
{
const ucell highbit = MAXUVALUE & ~(MAXUVALUE >> 1);
if (divisor == 0)
return false;
quotient.hi = dividend.hi / divisor;
remainder = dividend.hi % divisor;
quotient.lo = 0;
bool carry = false;
for (byte bit = 0; bit < cell_bits; ++bit) {
carry = (remainder&highbit);
remainder <<= 1;
quotient.lo <<= 1;
if (dividend.lo&highbit)
remainder |= 1;
if (carry || remainder >= divisor) {
remainder -= divisor;
++quotient.lo;
}
dividend.lo <<= 1;
}
return true;
}
Есть ли способ проще (не используя _udiv64 / _udiv128, у меня VS 2017).
Доп. условие - inline assembler тоже не годится, в режиме x64 он недоступен.