微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决可以在位掩码中安全使用的 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 bits

按位运算符将其操作数视为一组 32 位(零和一)并返回标准 JavaScript 数值。

Specification

6.1.6.1.9 Number::leftShift ( x,y )

  1. 让 lnum 成为! ToInt32(x)。
  2. 让 rnum 成为! ToUint32(y)。
  3. 让 shiftCount 是除掉 rnum 的最低有效 5 位之外的所有位的结果,即计算 rnum & 0x1F。
  4. 返回 lnum 左移 shiftCount 位的结果。结果是一个有符号的 32 位整数。
,

请注意,如果使用 BigInt 对象,则位掩码仅受内存限制,因此可以管理超过 32 位的掩码。通常按照问题的思路,例如,可以将 127 位的掩码设置为全 1,如下所示...

x = ( 1n

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

...然后,比如说,清除第 16 位...

x &= ~( 1n

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

...并检查是否设置了一点,例如 17...

( ( 1n

  • 真实

...或检查是否设置了第 16 位...

( ( 1n

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

请注意,对于极端的 BigInt 掩码,将 Uint32 数组作为集合位掩码进行管理可能比使用本机 BigInt 位操作函数的性能更高。因此,如果性能存在问题,则需要通过实验来确定 BigInt 位掩码对于手头的用例是否可接受...

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。