乘法函数

时间:2014-06-10 11:30:12

标签: binary bit-manipulation

我需要提取十进制数位。 例如,y = 52(110100到二进制)和j = 2 .. 所以我需要返回1 ... 如果j = 3则返回0 ...

这是我的功能...

function int multiply(int x, int y) {

    var int tx;
    var int ty;

    let tx = x;
    let ty = y;

    let tx = Math.abs(x);
    let ty = Math.abs(y);

    var int shiftedX;
    let shiftedX = tx;

    var int result;
    let result = 0;

    var int i;
    let i = 0;
    while(i<16){
        if( i-th bit of ty = 1 )//pseudo code...
        {
            let result = result + shiftedX;
        }
        let shiftedX = shiftedX + shiftedX;
    }
    if(((x > 0) & (y < 0)) | ((x < 0) & (y > 0))){
        return -result;
    }
    return result;
}

我在“if”伪代码中写道

我怎么能用真正的代码呢?

3 个答案:

答案 0 :(得分:1)

在回答这个问题时,它被标记为C或C ++ ......


首先,摆脱以下符号(因为它们不是语言的一部分):

- function
- var
- let

关于您的问题,您可以使用以下代码:

for (i=0; i<16; i++)
{
    if ((ty>>i) & 1)
    {
        result += shiftedX;
    }
    shiftedX <<= 1;
}

答案 1 :(得分:1)

杰克似乎缺乏位移,但是没关系,我们可以像shiftedX保持最新(而不是做tx << i)一样制作正确的掩码,如下所示:

var int shiftedX;
let shiftedX = x;
var int mask;
let mask = 1;
var int i;
let i = 0;
while(i < 16){
    if((y & mask) = mask)
    {
        let result = result + shiftedX;
    }
    let shiftedX = shiftedX + shiftedX;
    let mask = mask + mask;
    let i = i + 1;
}

你可以省略abs的东西和最后的符号修复(只要你把它们两个掉),有符号和无符号的乘法都是一样的。< / p>

答案 2 :(得分:0)

我是官方Nand2Tetris帮助论坛的主持人之一     http://nand2tetris-questions-and-answers-forum.32033.n3.nabble.com/ 一定要检查并发布那里的帮助。

关于有符号与无符号乘法:

当您将两个16位数相乘时,得到32位结果。无论您乘以的数字是有符号还是无符号,此结果的最后16位都是相同的;只有高16位是不同的。

由于Math.multiply例程只返回16位,因此您不必担心x和y的符号。