有人能把这个简单的函数翻译成Javascript吗

Can someone translate this simple function into Javascript?

本文关键字:翻译 函数 Javascript 简单      更新时间:2023-09-26

我正在阅读一篇关于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位的计算机上,对吧?

它应该在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双,但是。。。一旦开始对数字使用逐位运算符,JavaScript就会在计算期间将操作数视为有符号的32位整数。

以下是JavaScript如何处理位操作的一个很好的解释:

  • 逐位运算符

x<<13表示向左移动x 13步(按位)。此外,CCD_ 8等价于CCD_ 9。

& 7ffffff表示左侧与7FFFFFFF的位"与"。如果你看一下7FFFFFFF的比特模式,你会注意到比特32是0,其余的比特是1。这意味着您将屏蔽位0-30并丢弃位31。