javascript - 为什么移动 0 会 chop 小数?

标签 javascript numbers operators bitwise-operators bit-shift

我最近发现了这段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/

相关文章:

java - 我收到从 int 到 boolean 类型不匹配的错误

javascript - angularjs 中的指令不显示?

SQLite ISO(即欧洲风格)周数

Javascript:+= 运算符的奇怪行为

C# LuaInterface 类运算符

function - 在语言环境中使用逗号作为小数点标记分隔函数的参数

javascript - 使粘性 div 达到一定程度

javascript - 带 Bootstrap 可排序表的区分大小写的 Tinysort

Javascript 关闭和内存问题

java - 如何显示整个 double 值?