我最近发现了这段JavaScript代码:

Math.random() * 0x1000000 << 0

我知道第一部分只是生成一个介于0和0x1000000(== 16777216)之间的随机数。

但是第二部分似乎很奇怪。进行0位移的意义何在?我认为它不会做任何事情。但是,在进一步调查后,我注意到将0移位似乎会 chop 数字的小数部分。此外,无论是右移,左移还是无符号右移都没有关系。
> 10.12345 << 0
10
> 10.12345 >> 0
10
> 10.12345 >>> 0
10

我同时使用Firefox和Chrome进行了测试,其行为相同。那么,这种观察的原因是什么呢?难道它只是JavaScript的细微差别,还是它也出现在其他语言中?我以为我了解位移,但这让我感到困惑。

最佳答案

你说得对它用于 chop 该值。
>>起作用的原因是因为它仅对32位整数有效,因此该值被 chop 了。 (它通常也用在这种情况下,而不是Math.floor上,因为按位运算符的运算符优先级较低,因此可以避免造成括号的困惑。)

而且,由于它仅对32位整数进行运算,因此它也等效于四舍五入后带有0xffffffff的掩码。所以:

0x110000000      // 4563402752
0x110000000 >> 0 // 268435456
0x010000000      // 268435456

但这不是预期行为的一部分,因为Math.random()将返回0到1之间的值。

此外,它的作用与| 0相同,这很常见。

09-16 19:34