unsigned long _divulong (unsigned long x, unsigned long y) { unsigned long reste = 0L; unsigned char count = 32; bool c; do { // reste: x <- 0; c = MSB_SET(x); x <<= 1; reste <<= 1; if (c) reste |= 1L; if (reste >= y) { reste -= y; // x <- (result = 1) x |= 1L; } } while (--count); return x; }
unsigned int _moduint (unsigned int a, unsigned int b) { unsigned char count = 0; while (!MSB_SET(b)) { b <<= 1; if (b > a) { b >>=1; break; } count++; }