计算 A/B,假设 B 是一个已知的数字,如果 B 是 2 的整数次幂的话,直接移动就可以完成除法,如果不是,按下面的步骤做:

  1. 找 B 最高位, 也就是求最大的 b 令 2^b < B
  2. 令 r = 32 + b
  3. 计算 f = 2^r / B,
    如果 f 的小数部分 < 0.5,将 f 向下取整, A/B 的结果为 ((A+1) * f) >> r
    如果 f 的小数部分 > 0.5,将 f 向上取整, A/B 的结果为 (A * f) >> r
    如果 f 的小数部分 = 0.5, 可能么?

例子:

对于x/7
b = 2
r = 34
f = 2^34 / 7 = 2454267026.28
f 向下取整为 f = 2454267026
计算整型除法的公式为 x / 7 = (x * 2454267026) >> 34