使用二进制压缩布尔数组
Using binary to compress boolean array
我想知道是否有一种方法可以让我有效地存储布尔数组。在我的理解中,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-array
,ndarray-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% 的压缩并存储该字符串。这实际上很容易。
- 递归布尔和/或到数组的jison解析器
- Yui Get 复选框返回数组而不是布尔值
- 使用二进制压缩布尔数组
- Javascript数组到布尔类型强制没有意义
- 检查对象数组是否包含布尔值true/false
- JavaScript 数组的布尔值
- 如何在javascript中初始化布尔数组
- 多维布尔数组检查 Javascript 中是否全部为真
- 带有对象,数组和布尔值的棘手Javascript逻辑
- 根据布尔数组显示或隐藏jQuery元素
- javascript中的布尔值数组
- 从AJAX发送的数组中正确提取布尔值
- 按布尔值,然后按数字(javascript)对对象数组进行排序
- 将jquery条件is(':checked')转换为布尔数组
- 将函数数组作为布尔值数组返回
- Javascript布尔数组操作
- 在javascript中对字符串和布尔数组进行排序
- 当对象被删除时,布尔数组是未定义的
- JS:布尔数组vs Int8Array
- 在JavaScript中为嵌套集合执行布尔数组的更好方法