使用位运算符删除小数部分是如何工作的



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

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

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

我确实在找同样的东西。我能找到的最好的就是这个
那里的人们在谈论效率、优点和缺点。我感兴趣的是这实际上是如何工作的?

除无符号右移外的所有位操作,>>都处理有符号的32位整数。因此,使用逐位运算将浮点值转换为整数。

因此,使用逐位运算将浮点值转换为整数但是怎么做呢?

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

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

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

~或按位NOT通过在其运算符上调用ToInt32来做同样的事情。

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

使用~x将删除x的小数部分,并翻转其所有位。使用~~x也可以这样做,但将位翻转两次,因此结果就好像对原始表达式所做的一切都是去掉小数部分。

最新更新