(Nand2Tetris) Функция умножения не работает, только если y большое число - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над проектом 12 курса Nand2Tetris: Операционная система и кодирую функцию умножения в Math.jack.

В тестовой программе я прошел первые три теста, но не прошел четвертый тест из нижеприведенных.

    let r[0] = 2 * 3;                  // 6 -> OK
    let r[1] = r[0] * (-30);           // 6 * (-30) = -180 -> OK
    let r[2] = r[1] * 100;             // (-180) * 100 = -18000 -> OK
    let r[3] = 1 * r[2];               // 1 * (-18000) = -18000 -> Fail (r[3] gets 0...)

Мой код функции Multiply в Math.jack выглядит следующим образом: (извините, что мой код - беспорядок. Я новичок ..)

class Math {
    static Array bitArray; 

    /** Initializes the library. */
    function void init() {
        let bitArray = Array.new(16);
        return;
    }

    /** Returns the product of x and y. 
     *  When a Jack compiler detects the multiplication operator '*' in the 
     *  program's code, it handles it by invoking this method. In other words,
     *  the Jack expressions x*y and multiply(x,y) return the same value.
     */
    function int multiply(int x, int y) {
        var int index, sum, shiftedX, j, targetBit;
        var boolean negFlag;

        //initialize bitArray with 0
        let index = 0;
        while(index < 16) {
            let bitArray[index] = 0;
            let index = index + 1;
        }

        if(x < 0) {
            if( y < 0) {
                let x = -x;
                let y = -y;
                let negFlag = false;
            } else {
                let x = -x;
                let negFlag = true;
            }
        } else {
            if( y < 0) {
                let y = -y;
                let negFlag = true;
            } else {
                let negFlag = false;
            }
        }

        let j = 0;
        let sum = 0;
        let shiftedX = x;
        while(j <  16) {
            let targetBit = Math.bit(y, j);
            let j = j + 1;
            if(targetBit = 1) {
                let sum = sum + shiftedX;
            }
            let shiftedX = shiftedX + shiftedX;
        }

        if(negFlag) {
            return -sum;
        } else {
            return sum;
        }
    }

    function int bit(int x, int j) {
        var int decimal, i, result;

        let decimal = x;
        let i = 0;
        while(decimal > 0) {
            let result = 0;
            while(decimal > 1) {
                let decimal = decimal - 2;
                let result = result + 1;
            }       
            let bitArray[i] = decimal;   
            let decimal = result;
            let i = i + 1;
        }

        return bitArray[j];
    }
}

Я также тестировал некоторые другие программы и выяснили, что функция умножения не работает только тогда, когда y - большое число. Например, приведенный ниже код работает нормально:

let r[0] = -18000 * 1 // OK: r[0] gets -18000

, но когда я поменял местами x и y, он терпит неудачу и r [0] всегда получает 0.

let r[0] = 1 * -18000 // Fail: r[0] gets 0

Я не могу понять почему это происходит. Что я делаю не так?

...