给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
返回被除数 dividend 除以除数 divisor 得到的 商 。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。
提示:
-231 <= dividend, divisor <= 231 - 1
divisor != 0
class Solution {
public int divide(int dividend, int divisor) {
//考虑特殊情况 0 Integer.MAX_VALUE Integer.Min_VALUE
if(dividend == 0){
return 0;
}
if(dividend == Integer.MIN_VALUE && divisor == -1){
return Integer.MAX_VALUE;
}
//判断除数和被除数是否异号
boolean negative;
negative=(dividend^divisor) < 0;//异或^ 当且仅当为异号时,结果为1 负数<0 结果为true
int result=0;
//将除数和被除数转化为长整型,并取绝对值
long t=Math.abs((long)dividend);
long b=Math.abs((long)divisor);
for(int i=31;i >= 0;i--){
if((t >> i) >= b){
//符号<<表示左移,相当于乘2.符号>>表示右移,相当于除2.
result += 1 << i;
t -= b << i;
}
}
return negative?-result:result;
}
}