假设我编写了如下代码:
console.log((5/3)|0)
结果是1.
但为什么呢?在我看来,|0
表示+0
。但为什么它可以取消小数部分?
任何人都可以通过显示其内部二进制数字来完全理解这一点,我如何逐步获得该结果?
答案 0 :(得分:3)
这里,运算符|
是按位OR,并涉及分析计算机内部存储的浮点数。这是因为所有浮点数实际上都表示为32位。
值0
的所有32位都等于0
。 1
或0
位OR 0
仍然分别为1
,0
,因此所有32位保持不变。
通常,所有JS编号都是双精度数(64位浮点数)。请注意,在按位OR完成之前,JS编译器将将转换浮点操作数暂时转换为其 signed int 形式,这意味着它可能导致不同的值,特别是截断小数部分。在按位操作完成后,JS会将其转换回浮点数。
以下是按位OR后如何将float值截断为signed int的示例:
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.
"所有位运算符的操作数都以2的补码格式转换为带符号的32位整数。"
一步一步,这些位是(为了简洁,让它们是单精度浮点数,JS小数是双倍的):
100 / 3: 0 10000100 0000101 01010101 01010101
100 / 3
在按位OR之前被转换为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。答案 1 :(得分:1)
5/3
是
1.6666666666666667
但是,正如对该问题的评论中所指出的,按位运算符(如|
)将其参数转换为带符号的32位整数。这个截断到零小数位。
因此
(5/3)|0
变为1|0
,即1
。
(#34的中间运算符;将浮点数截断为整数"无法在JS中显示,为了看到在运行中你需要类似C的东西,你可以明确地执行这些操作。)