使用二进制来压缩布尔数组

时间:2016-04-24 22:59:08

标签: javascript arrays node.js binary boolean

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

在C或Java等语言中,人们可以使用“>>”,“〜”之类的位操作将布尔数组存储到int值中。但是,这在JavaScript中不能很好地工作,因为它在JavaScript中的工作速度非常慢,因为它需要将浮点数转换为int(See this question)。

我还注意到JavaScript中的缓冲区直接存储二进制数据。但是,我找不到一种方法来使用它来存储布尔数组。我认为缓冲区更专注于编码内容。例如,如果我想将布尔数组的第五位设置为true,我可以data |= 1<<4但我无法在Buffer中找到这样做的方法。

任何解决方案?

4 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

这是什么意思? (最大指数为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;
}

答案 2 :(得分:1)

作为已接受答案的替代方案,还有minimal-bit-array ndarray-bitndarray所依据的,均由https://github.com/micro-elements/MicroElements.Swashbuckle.FluentValidation本身的创建者制作。非常类似的用法(来自自述):

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

答案 3 :(得分:0)

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

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