Implementing c binary division in o(1) -


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.