コンピューターシステムの理論と実装12章の除算のサンプルコードが何をしているのかよくわからなかったので整理

大変なことになってしまった

f:id:inabajunmr:20210222013304p:plain

  • ざっくり言ってしまえば、割り算の筆算を2進数でやっている
  • qは現時点で埋まった解答
  • x - 2 * q * y は、x - 今までの計算で引いてきた値を合計したやつ
  • 表の4段目の状態だと、qは10で、ここまで引いてきた値の合計は 10 * 110000000 + 0 * 110000000であらわせる(3段目の2つの★)
    • これが2 * q * y
      • 1つ前の表で計算したy * qをする必要があって桁を上げるために * 2している(4段目であれば q2 * y2 をしたいが、この時点でyはy3なのでy2に戻している
  • x - 2 * q * y < y の場合、今の桁の解答を1にして次の桁に進む(これが 2 * q + 1+1
    • 結果、次の計算のqは101になる(最後の1が+1の1)

おんなじようなことを10進数でやるとこんな感じになる

function devide(x:number, y:number, d:number):number {
    if(y > x) return 0
    let q = devide(x, 10 * y, d * 10)
    var i = 9
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    i--
    if(y * i <= x - (q * y)) {
        return i * d + q
    }
    return q
}