题目

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;
}