乘法,除法,开方的简单实现

这些实现方法都是基于二进制来完成的,很容易用计算机的简单指令实现。

乘法通过shift和add来实现:

function void init() {
    let tt = Array.new(16);
    tt[0] = 1;
    tt[1] = 2;
    tt[2] = 4;
    tt[3] = 8;
    tt[4] = 16;
    tt[5] = 32;
    tt[6] = 64;
    tt[7] = 128;
    tt[8] = 256;
    tt[9] = 512;
    tt[10] = 1024;
    tt[11] = 2048;
    tt[12] = 4096;
    tt[13] = 8192;
    tt[14] = 16384;
    tt[15] = 32768;
}

funcetion int multiply(int x, int y) {
    int sum, shift, i;
    let sum = 0;
    let shift = x;
    let i = 0;
    while (i < 16) {
        if (bit(x, i)) {
            sum = sum + shift;
        }
        i = i + 1;
        shift = shift + shift;
    }
}

除法实现类似于10进制的长除法,只不过除数使用二进制向上试探。其中 `_div2` 这种实现可以减少一次乘法调用,但是需要多一个存储空间。


def _div1(x, y):
    if x < y:
        return 0
    q = _div1(x, 2 * y)
    q2 = q * 2
    qy2 = q2 * y
    if (x - qy2) < y:
        pass
    else:
        q2 += 1
    return q2


def _div2(x, y):
    if x < y:
        return 0, 0
    q, qy2 = _div2(x, 2 * y)
    q2 = q * 2
    # qy2 = q * 2 * y = q2 * y
    if (x - qy2) < y:
        pass
    else:
        q2 += 1
        # 如果这里q2 += 1的话,那qy2需要+y
        qy2 += y
    return q2, qy2


def div(x, y):
    q1 = _div1(x, y)
    q2, _ = _div2(x, y)
    assert q1 == q2
    return q2

开方实现则是通过二分法来实现的

def sqrt(x):
    v = 0
    for i in reversed(range(32)):
        t = v + (1 << i)
        if (t * t) <= x:
            v = t
    return v