【问题标题】:Using binary to compress boolean array使用二进制压缩布尔数组
【发布时间】:2016-08-18 05:04:54
【问题描述】:

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

在 C 或 Java 等语言中,人们可以使用“>>”、“~”等位操作将布尔数组存储为 int 值。但是,这在 JavaScript 中效果不佳,因为它在 JavaScript 中运行速度非常慢,因为它需要将浮点数转换为 int (See this question)。

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

有什么办法吗?

【问题讨论】:

  • 它在 JavaScript 中运行速度极慢”——不要被 09 年的问题和 12 年的答案所迷惑。 JS 引擎已经向前发展,优化整数/位算术是最简单的事情之一。
  • FWIW v8 对“小”整数 (SMI) 进行了优化。你可以阅读这些限制here。您也可以使用缓冲区,但由于它们使用字节,您将被限制为每个索引 8 个布尔值。
  • 要访问缓冲区,您需要使用typed array,例如Uint8Array
  • @Bergi 好的,谢谢。 :) 下次我应该做基准测试

标签: javascript arrays node.js binary boolean


【解决方案1】:

You can use a Bit-Vector implementation:

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

【讨论】:

    【解决方案2】:

    这是你的意思吗? (最大索引为 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;
    }
    

    【讨论】:

      【解决方案3】:

      作为已接受答案的替代方案,还有 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
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多