1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
static unsigned long _dl_div(
unsigned long num,
unsigned long den,
unsigned long * rem)
{
unsigned long quot = 0, qbit = 1;
if (den == 0)
return 0;
/* Left-justify denominator and count shift */
while ((int) den >= 0) {
den <<= 1;
qbit <<= 1;
}
while (qbit) {
if (den <= num) {
num -= den;
quot += qbit;
}
den >>= 1;
qbit >>= 1;
}
if (rem)
*rem = num;
return quot;
}
static unsigned long _dl_mod(unsigned long num, unsigned long den)
{
unsigned long rem;
_dl_div(num, den, &rem);
return rem;
}
|