i found (slightly modified) code implement division on unsigned numbers:
#include <climits> #include <stdio.h> unsigned divide(unsigned dividend, unsigned divisor) { unsigned current = 1; unsigned answer=0; if ( divisor > dividend) return 0; if ( divisor == dividend) return 1; while (divisor <= dividend) { // not work uint_max divisor <<= 1; current <<= 1; } divisor >>= 1; current >>= 1; while (current!=0) { if ( dividend >= divisor) { dividend -= divisor; answer |= current; } current >>= 1; divisor >>= 1; } return answer; } int main() { unsigned int x =0; x = divide (uint_max,113); printf ("%u",x); return 0; }
it works great "normal" values, dividing max unsigned int value creates problem; since it's oxffffffff not possible shift divisor enough make bigger - further shifting push divisor on 32 bit limit , destroy value creating infinite loop. can suggestion on how fix error? perhaps create hard code case?
instead of
while (divisor <= dividend) { // not work uint_max divisor <<= 1; current <<= 1; } divisor >>= 1; current >>= 1;
try
unsigned k = 1 << (sizeof(unsigned) * 8 - 1); while (((divisor & k) == 0) && ((divisor << 1) <= dividend)) { divisor <<= 1; current <<= 1; }
the idea in suggested algorithm last left shift of divisor
, current
compensated right shift later. may avoid @ first place.