题目来源:https://leetcode-cn.com/problems/xoh6Oh/
大致题意:
给两个整数 a 和 b,不使用除法求出 a 除 b 的结果,只保留整数结果,如果结果溢出,输出 231 − 1
思路
- 循环减求出结果
- 接下来讨论的位运算
位运算
- 将两个数转为正数,且为长整型(防止溢出)
- 从整型最高位开始遍历至最低位
- 遍历时,若被除数大于等于除数左移当前位数后的值,表示除数扩大 2当前位数 倍后仍小于等于被除数,所以2当前位数小于等于商的值(相当于被除数循环减了2当前位数次除数,不过是一次性减的),然后将被除数减去除数左移当前位数后的值
- 重复第三步,直到修改后的被除数小于除数,或者遍历结束
代码:
public int divide(int a, int b) {
// 越界情况
if (a == Integer.MIN_VALUE && b == -1) {
return Integer.MAX_VALUE;
}
// 先存下符号
boolean flag = (a < 0) ^ (b < 0);
// 将两个数转为长整型正数
long x = Math.abs((long)a);
long y = Math.abs((long)b);
// 为 0 的情况
if (x < y || x == 0) {
return 0;
}
int ans = 0;
// 从最高位开始遍历
for (int i = 31; i >= 0 && x >= y; i--) {
// 若当前被除数大于等于除数左移当前位数后的值,更新商值
if (x >= (y << i)) {
ans += 1 << i;
x -= y << i;
}
}
return flag ? -ans : ans;
}