class Solution {
public:
int divide(int dividend, int divisor) {
// 考虑被除数为最小值的情况
if (dividend == INT_MIN) {
if (divisor == 1) {
return INT_MIN;
}
if (divisor == -1) {
return INT_MAX;
}
}
// 考虑除数为最小值的情况
if (divisor == INT_MIN) {
return dividend == INT_MIN ? 1 : 0;
}
// 考虑被除数为 0 的情况
if (dividend == 0) {
return 0;
}
// 一般情况,使用类二分查找
// 将所有的正数取相反数,这样就只需要考虑一种情况
bool rev = false;
if (dividend > 0) {
dividend = -dividend;
rev = !rev;
}
if (divisor > 0) {
divisor = -divisor;
rev = !rev;
}
vector<int> candidates = {divisor};
// 注意溢出
while (candidates.back() >= dividend - candidates.back()) {
candidates.push_back(candidates.back() + candidates.back());
}
int ans = 0;
for (int i = candidates.size() - 1; i >= 0; --i) {
if (candidates[i] >= dividend) {
ans += (1 << i);
dividend -= candidates[i];
}
}
return rev ? -ans : ans;
}
};
问:ans += (1 << i);这个是什么意思,为什么要用这个 (1 << i),讲讲语法吗?
问:candidates.back() ,back()函数代表什么意思
<<是位运算符 表示左移
位运算符作用于整数类型的运算对象,并把运算对象看作二进制位的集合
计算机都是二进制存储的
例如:5的二进制为:101
5<<1表示5左移一位
即:1010 (左移以后在右侧插入0)
原来:101 = 1*2^2+0*2^1+1*2^0
左移后: 1010=1*2^3+0*2^2+1*2^2+0*2^0
相当于乘了2的一次方
所以
1<<i 就表示 1左移i位 (即1*(2的i次方))
位运算符还包括~、<<、>>、&、^、| 可以看书或百度了解
back()函数表示vector的最后一个元素,即candidates的最后一个元素
(1 << i) 左移i位
candidates.back() 返回vector最后一个元素
<<左移运算符,相当于 *2;
>>右移运算符,相当于 /2;
vector back():返回最后一个元素
问:candidates.back() ,back()函数代表什么意思
先说这个,back表示vector的最后一个。
while (candidates.back() >= dividend - candidates.back()) {
candidates.push_back(candidates.back() + candidates.back());
}
所以,这段的作用就是vector中会保存[divisor, 2 * divisor, 4 * divisor, 8 * divisor, ...]
问:ans += (1 << i);这个是什么意思,为什么要用这个 (1 << i),讲讲语法吗?
结合candidates中的,ans就是要计算有多少个divisor。1 << i 就是将1右移几位,其实就是获取上面的2, 4, 8,。。。