可以在位掩码中安全使用的 Javascript 的最高值是多少?



假设我想在Javascript中创建一个位掩码。我将像这样打开一点:

mask |= (1 << bit);

像这样清除一点:

mask &= ~(1 << bit);

并检查位是否这样设置:

(bit & mask) != 0

我的问题是,这在Javascript中工作的最安全的位数是多少?我有三个主要的猜测:

  1. 32位,因为32位之后的位操作可能没有定义
  2. 53位,因为Number.MAX_SAFE_INTEGER2^53 - 1
  3. 64位,因为Javascript对每个数字使用64位

哪一个是正确的?还是其他原因?

32位:

位运算符将其操作数视为32位(0和1)的集合,并返回标准的JavaScript数值。

规范:

6.1.6.1.9数量:leftShift (x, y)

  1. 让lnum去吧!ToInt32 (x)
  2. 让rnum去吧!ToUint32 (y)。
  3. 让shiftCount是屏蔽掉rnum中除最不重要的5位之外的所有位的结果,即计算rnum &0 x1f。
  4. 按shiftCount位返回左移的结果。结果是一个带符号的32位整数。

请注意,如果使用BigInt对象,那么位掩码仅受内存约束的限制,因此可以管理远超过32位的掩码。通常沿着问题的思路,例如,可以将127位的掩码设置为所有1,如下所示…

x = (1n <<

  • x: 340282366920938463463374607431768211455 n
  • x.toString (2): 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

…然后,输入clear bit 16…

x &= ~(1n <<16 n)

  • x: 340282366920938463463374607431768145919 n
  • x.toString (2): 11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111101111111111111111

…然后检查是否设置了位,比如17…

((1n <<n) &== 0n

真正

…或者检查16位是否被设置…

((1n <<16n) &== 0n

JavaScript还有BigUint64Array对象,它是一个64位无符号BigInt整数的类型数组,按平台字节顺序排列。这也是位掩码要求在33位到64位范围内的一个选项…

请注意,对于极端的BigInt掩码,管理一个Uint32的数组作为集合位掩码,而不是使用本地的BigInt位操作函数,可能会更有性能。因此,如果性能有问题,就需要进行实验,以确定BigInt位掩码是否适用于手头的用例…

相关内容

  • 没有找到相关文章

最新更新