Binary 乘函数

Binary 乘函数,binary,bit-manipulation,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;

我需要提取一位十进制数。 例如,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;
}
函数整数乘法(整数x,整数y){
var-int-tx;
变量int-ty;
设tx=x;
设ty=y;
设tx=Math.abs(x);
设ty=Math.abs(y);
var int-shiftedX;
设shiftedX=tx;
var-int结果;
设结果=0;
var int i;
设i=0;
而(i0)和(y<0))|((x<0)和(y>0))){
返回结果;
}
返回结果;
}
我写了“如果”伪代码


我如何用真正的代码来实现??< /P> < P> <强>在回答这个问题时,它被标记为C或C++ + < /强>


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

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

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

{
结果+=移位x;
}

shiftedXJack似乎缺少位移位,但这没关系,我们可以用与保持
shiftedX
最新相同的方法制作正确的掩码(而不是执行
tx我是官方NAND2TTERIS帮助论坛的主持人之一)
一定要检查并张贴在那里寻求帮助

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

当您将两个16位数字相乘时,将得到一个32位的结果。无论您要相乘的数字是有符号的还是无符号的,此结果的底部16位都是相同的;只有上面的16位不同


因为Math.multiply例程只返回16位,所以您不需要担心x和y的符号。

简单,您实现了伪代码。很抱歉,这是一个错误,我更正了它。如果(ty的第I位=1)
shiftedX+shiftedX
OK@harold:当然没关系,但我觉得OP希望从中得到一些其他的东西。这样,它最终会成倍增加,那么问题出在哪里?另外,最后一部分是纠正符号的方法(由于开始时的abs而损坏)@哈罗德:没问题。我承认我没有研究代码的目的,只是研究了手头的具体问题。而且由于代码中有很多“谜题”,我认为它可能是其中之一(因为编写
shiftedX=shiftedX*2
,即使是“非常”的初学者,也要简单得多)。谢谢你的回答,但你确定我不需要注意符号吗?@user3460154非常确定,但你可以尝试两种方法,看看它是否有任何区别。Hi@harold对于除法函数,你认为我不注意符号吗?比如乘法?Thanks@benhi不幸的是,这的确很重要。
for (i=0; i<16; i++)
{
    if ((ty>>i) & 1)
    {
        result += shiftedX;
    }
    shiftedX <<= 1;
}
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;
}