static inline uint32_t mod(uint32_t dividend, uint32_t divisor) {
int32_t divdlen = 31, divslen = 31;
int32_t divsshift;
if(dividend == 0 || divisor == 0) {
return 0;
}
while((divdlen >= 0) && !((dividend >> divdlen) & 0x1)) {
divdlen--;
}
divdlen += 1;
while((divslen >= 0) && !((divisor >> divslen) & 0x1)) {
divslen--;
}
divslen += 1;
divsshift = ((divisor << (divdlen - divslen)) > dividend) ? (divdlen - divslen - 1) : (divdlen - divslen);
do {
dividend -= (divisor << divsshift);
while(dividend < (divisor << divsshift)) {
divsshift--;
if(divsshift < 0) return dividend;
}
if(divsshift < 0) return dividend;
}while (dividend >= (divisor << divsshift));
return dividend;
}
原文:https://www.cnblogs.com/yanye0xff/p/13520964.html