王ゲージ:
なぜコード事項のこのライン?(私はそれなしで間違った答えを得ます)
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
質問:
乗算、除算とMOD演算子を使用せずに2つの整数を分割します。
それはオーバーフローの場合は、2147483647を返します
回答
public int divide(int dividend, int divisor) {
if(divisor == 0){
return dividend > 0 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
if(dividend == 0){
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
boolean isNeg = (dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0);
Long up = Math.abs((long) dividend);
Long down = Math.abs((long) divisor);
int res = 0;
while(up >= down){
int shift = 0;
while(up >= (down << shift)){
shift++;
}
up -= down << (shift - 1);
res += 1 << (shift - 1);
}
return isNeg ? -res : res;
}
xingbin:
Javaは店に32ビットを使用しますint
。
最大int型の値が2である31 -1
0111 1111 1111 1111 1111 1111 1111 1111
分int値は、-2 31
1000 0000 0000 0000 0000 0000 0000 0000
つまり、intが2保管するのに十分な大きさ値は持っていません31(-Integer.MIN_VALUE
)を。