You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用减法替代除法:如何通过减法近似实现除法运算

用移位+减法实现近似整数除法(无浮点数、接近常规除法速度)

核心思路

别用逐次减除数的笨方法(O(n)复杂度,慢到离谱),改用移位+减法的思路——模拟硬件除法的"试商"逻辑:通过快速倍增除数(左移即乘2,CPU单周期指令),快速逼近被除数,全程用整数运算,时间复杂度O(log n),速度能接近常规除法。

实现步骤(无符号整数场景)

要计算dividend ÷ divisor的近似商(向下取整,天然符合"不需要精确结果"的要求,若要更粗略的近似还能提前终止):

  • 先处理边界:除数为0直接返回无效值;被除数小于除数时商为0。
  • 找到最大移位次数:把除数不断左移,直到移位后的值超过被除数,记录移位次数。
  • 从最大移位次数倒推:每次尝试用被除数减移位后的除数,够减就把对应2的幂次加到商里,同时更新被除数。
  • 直到移位次数归0,得到的商就是结果。

示例代码(C语言)

unsigned int approx_div(unsigned int dividend, unsigned int divisor) {
    if (divisor == 0) return 0; // 处理除0
    if (dividend < divisor) return 0;
    
    unsigned int quotient = 0;
    int shift = 0;
    
    // 找到最大合法移位次数,避免溢出
    while ((divisor << shift) <= dividend && shift < 31) {
        shift++;
    }
    shift--; // 回退到最后一个有效移位
    
    while (shift >= 0) {
        if (dividend >= (divisor << shift)) {
            dividend -= (divisor << shift);
            quotient += (1U << shift);
        }
        shift--;
    }
    return quotient;
}

速度优势说明

移位是CPU原生单周期操作,整个循环最多执行32次(针对32位整数),和硬件除法的效率量级一致,远快于纯减法循环。全程无浮点数运算,没有精度损耗和额外开销。

近似性灵活调整

如果完全不需要精确结果,可以提前终止移位循环(比如只处理高16位的移位),循环次数直接减半,速度更快,结果精度稍低但满足近似需求。

内容的提问来源于stack exchange,提问作者dickson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 09:24:27