是任何浮点数 | 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|0
即 1
.
("truncate floating point to integer" 的中间运算符无法在 JS 中显示,要看到在实际操作中您需要类似 C 的东西,您可以在其中显式执行此类操作。)
在这里,运算符|
是按位或,涉及分析计算机内部存储的浮点数的位。这是因为所有的浮点数实际上都是用32位表示的。
值 0
的所有 32 位都等于 0
。 1
或 0
位或 0
仍将分别为 1
、0
,因此所有 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转回浮点数
假设我写了如下代码:
console.log((5/3)|0)
结果为 1。
可是为什么呢?在我看来,|0
意味着 +0
。但是为什么可以抵消小数部分呢?
任何人都可以通过显示其内部二进制数字让我完全理解它吗?我如何逐步获得该结果?
5/3
是
1.6666666666666667
但是,正如对该问题的评论所述,按位运算符(如 |
)将其参数转换为带符号的 32 位整数。这 将 截断为零个小数位。
因此
(5/3)|0
变成 1|0
即 1
.
("truncate floating point to integer" 的中间运算符无法在 JS 中显示,要看到在实际操作中您需要类似 C 的东西,您可以在其中显式执行此类操作。)
在这里,运算符|
是按位或,涉及分析计算机内部存储的浮点数的位。这是因为所有的浮点数实际上都是用32位表示的。
值 0
的所有 32 位都等于 0
。 1
或 0
位或 0
仍将分别为 1
、0
,因此所有 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 形式,产生整数 3333 : 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转回浮点数