假设我写了如下代码:
console.log((5/3)|0)
结果是1。
但是为什么呢?在我看来,|0
表示 +0
。但是为什么它可以抵消掉小数部分呢?
任何人都可以通过显示它的内部二进制数字来让我完全理解它吗?我怎样才能一步一步地得到这个结果?
最佳答案
此处,运算符|
是按位或,涉及分析计算机内部存储的 float 的位。这是因为所有 float 实际上都表示为 32 位。
值 0
的所有 32 位都等于 0
。 1
或 0
位或 0
仍将分别为 1
、0
,所以所有 32 位都保持不变。
通常,所有 JS 数字都是 double (64 位 float )。请注意,在按位或完成之前,JS 编译器会将浮点操作数转换 为signed int 形式,这意味着它可能会产生不同的值,特别是小数部分的 chop 。按位运算完成后,JS会将其转换回 float 。
下面是一个浮点值如何在按位或后被 chop 为有符号整数的示例:
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."
一步一步,这些位是(为简洁起见,让它们是单精度 float ,JS 小数是 double ):
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转回 float 。
关于javascript - 是任何 float | 0 = 固定数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50461561/