javascript - 是任何 float | 0 = 固定数?

标签 javascript numbers bitwise-operators arithmetic-expressions

假设我写了如下代码:

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

结果是1。

但是为什么呢?在我看来,|0 表示 +0。但是为什么它可以抵消掉小数部分呢?

任何人都可以通过显示它的内部二进制数字来让我完全理解它吗?我怎样才能一步一步地得到这个结果?

最佳答案

此处,运算符| 是按位或,涉及分析计算机内部存储的 float 的位。这是因为所有 float 实际上都表示为 32 位。

0 的所有 32 位都等于 010 位或 0 仍将分别为 10,所以所有 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 形式,产生整数 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转回 float 。

关于javascript - 是任何 float | 0 = 固定数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50461561/

相关文章:

regex - 如何在此正则表达式中包含负十进制数?

assembly - 仅通过 ADD、SUB、MUL 和 DIV 指令实现位运算

javascript - angular.isDefined 与 typeof

javascript - 强制在 Android/iOS 应用程序中打开 Youtube 链接

javascript - HTML5 Range 功能在移动设备上损坏

bitwise-operators - 在 Nimrod 中,按位运算的语法是什么?

javascript - 第一次尝试使用按位运算符进行标志检查

javascript - 如何使用 require 来组织我的代码

C GMP 无限精度 - 我做错了什么?

c# - 文本框中的数字值添加逗号