Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
题目大意:不用乘除取模运算计算两个数的除。
解题思路:只能用位运算了,当被除数大于除数,除数左移1位、2位……直到得到最大的然后用被除数减去它,将因数加到res上,这里有点二分的意思,依次循环往复,这里我把两个数都设为负数,因为0x80000000是最小的负数,它没有对应的最大正数。结果的正负由两个的符号决定,记录一个negFlag。代码感觉写的不够优雅,但是目前也就能写成这样了。
public int divide(int dividend, int divisor) { //overflow if (divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)) { return 0x7fffffff; } if (dividend == 0) { return 0; } int res = 0; boolean negFlag = (dividend ^ divisor) < 0; dividend = dividend < 0 ? dividend : -dividend; divisor = divisor < 0 ? divisor : -divisor; while (dividend <= divisor) { int offset = 0; int tmp = divisor; while (dividend <= tmp) { tmp = divisor << offset; offset++; if (tmp < (Integer.MIN_VALUE >> 1)) { break; } } offset -= 2; tmp >>= 1; dividend -= tmp; res += (1 << offset); if (offset == -1) { res = 1; } else if (offset == -2) { res = 0; } } return negFlag ? -res : res; }