使用二进制压缩布尔数组

Using binary to compress boolean array

本文关键字:布尔 数组 压缩 二进制      更新时间:2023-09-26

我想知道是否有一种方法可以让我有效地存储布尔数组。在我的理解中,JavaScript 中的每个布尔变量都需要 1 个字节或 8 位来存储。但是,如果我想存储布尔值数组,8 位实际上最多可以存储 8 个布尔值。其余 7 位被浪费。

在C或Java等语言中,人们可以使用诸如">>","~"之类的位运算将布尔数组存储到int值中。然而,这在 JavaScript 中效果不佳,因为它在 JavaScript 中运行得非常慢,因为它需要将浮点数转换为 int(请参阅此问题)。

我还注意到JavaScript中的Buffer直接存储二进制数据。但是,我找不到使用它来存储布尔数组的方法。我认为Buffer更专注于编码的东西。例如,如果我想将布尔数组的第五位设置为 true,我可以执行data |= 1<<4但在 Buffer 中找不到执行此操作的方法。

有什么解决办法吗?

您可以使用位向量实现:

var bs = new BitSet;
bs.set(128, 1); // Set bit at position 128
console.log(bs.toString(16)); // Print out a hex dump with one bit set

作为接受答案的替代方案,还有minimal-bit-arrayndarray-bit基于它,两者都是由ndarray本身的创建者制作的。非常相似的用法(来自自述文件):

var x = new BitArray(100)
x.set(5, true)
console.log(x.get(4)) // Prints false
console.log(x.get(5)) // Prints true

这是你的意思吗?(最大索引为 30):

function BoolArray(){
  this.arr = 0;
}
BoolArray.prototype.get = function(idx){
  return !!((this.arr >> idx) & 1)
}
BoolArray.prototype.set = function(idx, val){
  this.arr |= (val & 1) << idx;
}

看看这个惊人的答案:https://www.smashingmagazine.com/2011/10/optimizing-long-lists-of-yesno-values-with-javascript/

将布尔数组转换为 1 和 0,并将它们连接为字符串。为了进一步优化,您可以将 16 位块表示为 1 个 UTF-16 字符,以实现 93% 的压缩并存储该字符串。这实际上很容易。