3

我正在尝试执行一些位移操作并处理 JavaScript 中的二进制数。

这就是我想要做的。用户输入一个值,我用它执行以下操作:

// Square Input and mod with 65536 to keep it below that value
var squaredInput = (inputVal * inputVal) % 65536;
// Figure out how many bits is the squared input number
var bits = Math.floor(Math.log(squaredInput) / Math.log(2)) + 1;
// Convert that number to a 16-bit number using bitshift.
var squaredShifted = squaredInput >>> (16 - bits);

只要数字大于 46,它就可以工作。一旦小于46,它就不起作用。我知道问题出在移位中。现在来自 C 背景,我知道这样做会有所不同,因为所有数字都将以 32 位格式存储(假设它是int)。JavaScript 是否也这样做(因为它var没有类型)?

如果是这样,是否可以存储 16 位数字?如果不是,我可以将其视为 32 位并进行所需的计算以假设它是 16 位吗?

注意:我试图在squaredInput.

另一个注意事项:当打印出 var 时,它只是打印出没有填充的值,所以我无法弄清楚。尝试使用parseIntand toString

谢谢

4

2 回答 2

1

你在找这个吗?

function get16bitnumber( inputVal ){
   return ("0000000000000000"+(inputVal * inputVal).toString(2)).substr(-16);
}

此函数返回值的最后 16 位。(inputVal*inputVal)通过使用二进制字符串,您可以使用任何位范围。

于 2012-04-17T20:34:40.083 回答
0

如果您不是绝对必须,请不要在 JS 中使用位移位。规范提到至少四种数字格式

  • IEEE 754
  • 整数32
  • UInt32
  • UInt16

知道什么时候使用哪个真的很令人困惑。

例如,~在转换为 Int32 时应用位反转。UInt16 似乎只用于String.fromCharCode. 使用位移运算符将操作数转换为 UInt32 或 Int32。

在您的情况下,右移运算符>>> 强制转换为 UInt32。当您键入

a >>> b

这就是你得到的:

ToUInt32(a) >>> (ToUInt32(b) & 0x1f)
于 2012-04-17T21:25:32.633 回答