我需要用Jack语言编写除法函数。
我的代码是:
function int divide(int x, int y) {
var int result;
var boolean neg;
let neg = false;
if(((x>0) & (y<0)) | ((x<0) & (y>0))){
let neg = true;
let x = Math.abs(x);
let y = Math.abs(y);
}
if (y>x){
return 0;
}
let result = Math.divide(x, y+y);
if ((x-(2*result*y)) < y) {
if (neg){
return -(result + result);
} else {
return (result + result);
}
} else {
if (neg){
return -(result + result + 1);
} else {
return (result + result + 1);
}
}
}
该算法是次优的,因为每次乘法运算也需要O(n)加法和减法运算。
我可以在没有任何乘法的情况下计算乘积2 *结果* y吗?
由于
答案 0 :(得分:0)
这是(未签名)恢复部门(x/y
)的实施,我实际上并不认识杰克,所以我对此并不是百分之百确定
var int r;
let r = 0;
var int i;
let i = 0;
while (i < 16)
{
let r = r + r;
if ((x & 0x8000) = 0x8000) {
let r = r + 1;
}
if ((y ^ 0x8000) > (r ^ 0x8000)) { // this is an unsigned comparison
let x = x + x;
}
else {
let r = r - y;
let x = x + x + 1;
}
let i = i + 1;
}
return x;
您应该可以将其转换为签名部门。