m0_61574664 2022-01-07 16:49 采纳率: 87.1%
浏览 60
已结题

两数相除,有几个不明白的地方,希望能解答一下

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条回答 默认 最新

  • 大西布_ 2022-01-07 17:24
    关注

    <<是位运算符 表示左移
    位运算符作用于整数类型的运算对象,并把运算对象看作二进制位的集合
    计算机都是二进制存储的

    例如: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的最后一个元素

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 1月16日
  • 已采纳回答 1月8日
  • 创建了问题 1月7日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么