有人可以将这个简单的功能翻译成Javascript吗?

时间:2012-02-02 10:46:02

标签: javascript random pseudocode perlin-noise code-translation

我正在阅读a tutorial on 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吗?另外,正常的整数在JS中是32位,在32位计算机上,对吗?

2 个答案:

答案 0 :(得分:3)

它应该在JavaScript中工作,只需要很少的修改:

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

<<运算符是按位左移,因此<< 13表示将数字13位向左移位。

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

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

以下是JavaScript如何处理按位运算的一个很好的解释:

答案 1 :(得分:3)

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

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