题目要求:
分析:
由于是有符号整数,所以我们要把正负情况都考虑进去。
为了简便运算,主体代码算的全是正的值,然后设置一个sign来表示正负号就可以了。
接下来主要看如何进行这个除法运算。
由于题目要求我们不能用乘法、除法、mod运算符,所以第一反应就是考虑位运算。
对于位运算,左移一位是*2,右移一位是/2.
在这里,我们要求的是它的商,可以这样考虑:
在被除数 >= 除数的条件下,令一个temp = 1,然后将除数左移一位,如果此时的除数 <= 被除数,则temp也左移一位,直到除数 > 被除数为止。
举个例子:
具体代码如下:
class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1))
return Integer.MAX_VALUE;
int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1;
long ldividend = (long)dividend;
long ldivisor = (long)divisor;
ldividend = Math.abs(ldividend);
ldivisor = Math.abs(ldivisor);
int count = 0;
while(ldividend >= ldivisor) {
long lds = ldivisor;
long temp = 1;
while((lds << 1) <= ldividend) {
lds = (lds << 1);
temp = (temp << 1);
}
count += temp;
ldividend = ldividend - lds;
}
return count * sign;
}
}