0

我正在阅读有关 Perlin Noise 的教程,我遇到了这个功能:

function IntNoise(32-bit integer: x)             

    x = (x<<13) ^ x;
    return ( 1.0 - ( (x * (x * x * 15731 + 789221) + 1376312589) & 7fffffff) / 1073741824.0);    

end IntNoise function

虽然我确实了解其中的某些部分,但我真的不明白什么是(x<<13)& 7fffffff应该是什么意思(我看到它是一个十六进制数字,但它有什么作用?)。有人可以帮我把它翻译成 JS 吗?此外,在 32 位计算机上,JS 中的普通整数是 32 位的,对吗?

4

2 回答 2

3

它应该可以在 JavaScript 中进行最少的修改:

function IntNoise(x) {
    x = (x << 13) ^ x;
    return (1 - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7fffffff) / 1073741824);
}

<<运算符是按位左移,因此<< 13意味着将数字向左移动 13 位。

&运算符是按位与。对有符号 32 位整数执行& 0x7fffffff操作会屏蔽符号位,确保结果始终为正数(或零)。

至少可以说,JavaScript 处理数字的方式有点古怪。所有数字通常表示为IEEE-754 doubles,但是......一旦您开始对数字使用按位运算符,那么 JavaScript 将在计算期间将操作数视为有符号的 32 位整数。

这里很好地解释了 JavaScript 如何处理按位运算:

于 2012-02-02T10:54:36.903 回答
3

x<<13表示向左移动 x 13 步(按位)。此外a<<b相当于a*2^b

& 7ffffff表示左侧与 7FFFFFFF 的按位与。如果您查看 7FFFFFFF 的位模式,您会注意到位 32 为 0,其余位为 1。这意味着您将屏蔽位 0-30 并删除位 31。

于 2012-02-02T10:54:39.620 回答