我想知道是否有一种方法可以让我有效地存储一个布尔数组。根据我的理解,JavaScript中的每个布尔变量都需要1个字节或8位来存储。但是,如果我想存储一个布尔值数组,那么8位实际上最多可以存储8个布尔值。剩下的7位浪费了。
在C或Java等语言中,人们可以使用“>>”,“〜”之类的位操作将布尔数组存储到int值中。但是,这在JavaScript中不能很好地工作,因为它在JavaScript中的工作速度非常慢,因为它需要将浮点数转换为int(See this question)。
我还注意到JavaScript中的缓冲区直接存储二进制数据。但是,我找不到一种方法来使用它来存储布尔数组。我认为缓冲区更专注于编码内容。例如,如果我想将布尔数组的第五位设置为true,我可以data |= 1<<4
但我无法在Buffer中找到这样做的方法。
任何解决方案?
答案 0 :(得分:2)
答案 1 :(得分:1)
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-bit
,ndarray
所依据的,均由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%的压缩并存储该字符串。实际上很简单。