题目

C 代码
#define U32_MIN (0x80000000)
#define U32_MAX (0x7FFFFFFF)
int can_shift(int val, int offset) {
int i = 0;
int old_val = 0;
if (val == 0) return 0;
if (val > (1 << 30)) return 0;
for (i = 0; i < offset; i++) {
old_val = val;
if (val > ((1 << 30) - 1)) return 0;
val = (val << 1);
val &= 0x7FFFFFFF;
if (val == 0) return 0;
if (val < old_val) return 0;
}
return 1;
}
int divide(int dividend, int divisor) {
int i = 0;
int ret = 0;
int sign = 0;
int one = 0;
int maps[32] = {0};
if (dividend == divisor) return 1;
if (divisor == 1) return dividend;
if (divisor == -1) {
if (dividend == U32_MIN) {
return U32_MAX;
}
return -dividend;
}
if (dividend < 0) {
if (dividend == U32_MIN) {
dividend = U32_MAX;
one = 1;
} else {
dividend = -dividend;
one = 0;
}
sign ^= 1;
}
if (divisor < 0) {
if ( divisor == U32_MIN) {
return 0;
}
divisor = -divisor;
sign ^= 1;
}
if (divisor > dividend) return 0;
for (i = 30; i >= 0; i--) {
if(can_shift(divisor, i) == 0 && i != 0) {
maps[i] = 0;
continue;
}
while ( 1 ) {
if ( dividend >= ((divisor << i) - one) ) {
dividend -= (divisor << i);
maps[i] += 1;
} else {
break;
}
}
}
ret = maps[0];
for (i = 1; i < 32; i++) {
ret += (maps[i] << i);
}
return (sign == 0) ? ret : -ret;
}