【问题标题】:How removing decimal parts with bitwise operators work? [duplicate]如何使用按位运算符删除小数部分? [复制]
【发布时间】:2020-08-09 22:00:38
【问题描述】:

我见过很多人使用按位运算符来删除小数部分,或使用按位运算符对数字进行四舍五入。

但是,我想知道这实际上是如何工作的?

let a = 13.6 | 0; //a == 13
let b = ~~13.6; // b == 13

我确实搜索过。我能找到的最好的是this
那里的人在谈论效率、利弊。我对这实际上是如何工作的很感兴趣?

除无符号右移 >>> 之外的所有按位运算都适用于有符号的 32 位整数。所以使用按位运算会将浮点数转换为整数。

所以使用按位运算会将浮点数转换为整数。但是如何?

【问题讨论】:

  • 您对整数和浮点值的理解是什么?您到底想知道什么 - 您是否对算法以及它如何处理边缘情况感兴趣,您是否正在寻找引擎实现,您是否想知道 RAM 中的各个位会发生什么?
  • 您想知道 RAM 中的各个位会发生什么变化吗? 这就是我要找的? OR 使用小数如何修剪小数部分?
  • 好的。好吧,它不处理单个位。它将 64 位视为双浮点表示,并对它们进行数学运算以得出整数。

标签: javascript floating-point bit-manipulation


【解决方案1】:

使用|,它的两个运算符通过NumberBitwiseOp操作转换为整数,该操作在两个运算符上调用ToInt32,其过程是:

抽象操作 ToInt32 接受参数参数。它将参数转换为 -231 到 231 - 1 范围内的 232 个整数值之一,包括端点。调用时会执行以下步骤:

  1. 让数字是? ToNumber(参数)。
  2. 如果数字是 NaN、+0、-0、+∞ 或 -∞,则返回 +0。
  3. 令 int 为与 number 符号相同且大小为 floor(abs(number)) 的 Number 值。
  4. 让 int32bit 为 int 模 2 ** 32。
  5. 如果 int32bit ≥ 2 ** 31,则返回 int32bit - 2 ** 32;否则返回 int32bit。

~,或按位非,does the same sort of thing,通过在其运算符上调用 ToInt32

使用x | 0 将删除x 的小数部分(通过ToInt32)并且不翻转任何位,所以就好像只删除了小数部分。

使用~x 将删除x 的小数部分并翻转所有位。使用~~x 会做同样的事情,但是将位翻转两次,所以结果就好像对原始表达式所做的只是去掉了小数部分。

【讨论】:

  • 我需要学习很多关于 JS 中的数字的知识,实际上我做了很多次但从未完全掌握它:(。这是为我解压缩答案的唯一关键。:)
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2013-05-24
相关资源
最近更新 更多