我正在阅读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位计算机上,对吗?
答案 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。