我最近发现了这段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
,更常见。
关于javascript - 为什么移动 0 会 chop 小数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46584664/