题目描述:给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。
思路:从除法的定义说,被除数除以除数等于商+余数。a/b=c。将c可以用二进制表示:
所以可以从大到小位移,如果a>>i>b,说明,已经找到最大的为1的位。此时a=a-b*2^i1。此时,res+=2的i1次方。直到找到最后一位为止。
class Solution {
public int divide(int dividend, int divisor) {
//先处理特殊情况
if(divisor==-1&÷nd==Integer.MIN_VALUE) return Integer.MAX_VALUE;
if(divisor==0) return 0;
//再处理正负号问题
boolean flag=(dividend^divisor)<0;
//都变为正数,消除位移时正负号的影响
long first=Math.abs((long)dividend);
long second=Math.abs((long)divisor);
//定义一个结果
int res=0;
//开始进行位运算
for (int i = 31; i >= 0; i--) {
if((first>>i)>=second){
res+=1<<i;
first-=(second<<i);
}
}
return flag?-res:res;
}
}
测试结果如下:
注意点:在取绝对值前,需要先转换类型;