Я работаю над проектом 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
Я не могу понять почему это происходит. Что я делаю не так?