我需要提取十进制数位。 例如,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”伪代码中写道
我怎么能用真正的代码呢?
答案 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的符号。