是任何浮点数 | 0 = 固定数?

Is any float number | 0 = a fixed number?

假设我写了如下代码:

console.log((5/3)|0)

结果为 1。

可是为什么呢?在我看来,|0 意味着 +0。但是为什么可以抵消小数部分呢?

任何人都可以通过显示其内部二进制数字让我完全理解它吗?我如何逐步获得该结果?

5/3

1.6666666666666667

但是,正如对该问题的评论所述,按位运算符(如 |)将其参数转换为带符号的 32 位整数。这 截断为零个小数位。

因此

(5/3)|0

变成 1|01.

("truncate floating point to integer" 的中间运算符无法在 JS 中显示,要看到在实际操作中您需要类似 C 的东西,您可以在其中显式执行此类操作。)

在这里,运算符|是按位或,涉及分析计算机内部存储的浮点数的位。这是因为所有的浮点数实际上都是用32位表示的。

0 的所有 32 位都等于 010 位或 0 仍将分别为 10,因此所有 32 位保持不变。

一般情况下,所有的JS数都是double(64位浮点数)。请注意,在按位或完成之前,JS 编译器会将浮点操作数 转换 signed int 形式,这意味着它可以导致不同的值,特别是小数部分的截断。按位运算完成后,JS会将其转换回浮点数。

下面是一个浮点值如何在按位或后被截断为有符号整数的例子:

var x = 100/3.0;
console.log(x);   // outputs 33.333333333333336
console.log(x|0); // outputs 33 (no decimal)

按位运算符的工作原理

There is a Mozilla documentation about the Javascript bitwise operators.

"The operands of all bitwise operators are converted to signed 32-bit integers in two's complement format."

一步一步,位是(为简洁起见,让他们是单精度浮点数,JS小数是双精度):

  • 100 / 3: 0 10000100 0000101 01010101 01010101
    • 指数位为132,无偏5,尾数位略大于1
  • 100 / 3 在按位或之前转换为 32 位 int 形式,产生整数 33
  • 33 : 0000 0000 0000 0000 0000 0000 0010 0001
  • 0 : 0000 0000 0000 0000 0000 0000 0000 0000
  • 33 | 0 : 0000 0000 0000 0000 0000 0000 0010 0001 再次生成整数 33。
  • 按位运算完成后,33转回浮点数