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

无算术运算符实现x/y:算法逻辑及代码细节技术问询

无算术运算符实现除法:算法解析与疑问解答

嘿,我懂你啃《Elements of Programming Interview》里无算术运算符除法这块卡壳的滋味——位运算的逻辑有时候确实得掰碎了才能看明白。我来逐个拆解你的疑问,结合那段代码帮你把思路理清楚:

1. 算法整体工作原理是什么?

这个算法本质是模拟手动除法的逻辑,只不过把十进制换成了二进制。
我们手动算十进制除法时,会先找最大的10^k * 除数不超过被除数,减去这个数后把10^k加到商里,重复直到被除数小于除数。这里换成二进制后,就是找最大的2^k * y(y是除数)不超过当前的被除数x,然后把2^k加到商里,再用x减去2^k*y,循环这个过程直到x < y为止。全程用位运算代替算术乘除,完全符合“无算术运算符”的要求。

比如你举的例子:x=11(二进制1011),y=2(二进制10):

  • 第一次找到最大的k=2,2^2*2=8 ≤11,把2^2=4(二进制100)加入商,x变成11-8=3(二进制11)
  • 接着找最大的k=0,2^0*2=2 ≤3,把2^0=1(二进制1)加入商,x变成3-2=1
  • 此时x<y,循环结束,商是4+1=5(二进制101),正好是11//2的结果。

2. 为何power初始值设为32?

这里的32是针对32位有符号整数的场景设置的。
在大多数编程语言里,标准的int类型是32位(范围是-2^31到2^31-1),初始把power设为32,就能让y << power直接跳到最大的可能倍数y*2^32,然后通过逐步右移(缩小倍数)来找到第一个不大于x的候选值。如果是64位整数场景,这里的初始值就会改成64——核心是从最高位开始往下找,避免遗漏最大的可能倍数。

3. 将y左移power位的作用是什么?

二进制里,左移n位等价于乘以2^n,所以y << power就是计算y * 2^power,也就是作者思路里的(2^k)y。
初始时把power设为32,就是直接生成最大的候选倍数,之后通过右移y_power(等价于除以2)来逐步缩小这个倍数,直到找到第一个不大于当前x的y*2^power。

4. y_power代表什么含义?

y_power就是当前我们测试的候选倍数,也就是y * 2^power,对应作者说的(2^k)y。
每次内层循环里,我们通过右移y_power和递减power来调整这个候选值,直到它不大于当前的x,此时这个值就是我们能从x里减去的最大的y的倍数。

5. 为何向result中添加1 << power?

1 << power等价于2^power,而这个值就是当前找到的商的一部分。
当y_power = y * 2^power ≤ x时,说明当前的x里包含2^power个y,所以要把这个数加到商(result)里。比如例子中k=2时,1<<2是4,加到result里;k=0时,1<<0是1,加进去后result就是5,正好是正确的商。

附上原代码方便对照:

def divide(x, y):
    result, power = 0, 32
    y_power = y << power
    while x >= y:
        while y_power > x:
            y_power >>= 1
            power -= 1
        result += 1 << power
        x -= y_power
    return result

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:06:03