划分功能

时间:2014-06-11 13:18:05

标签: binary bit-manipulation

我需要用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吗?

由于

1 个答案:

答案 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;

您应该可以将其转换为签名部门。