2016-04-24 4 views
0

ブール値の配列を効率的に格納できる方法があるかどうかは疑問です。私の理解では、JavaScriptのすべてのブール変数は1バイトまたは8ビットのデータを格納します。しかし、ブール値の配列を格納したい場合、8ビットは実際には最大8つのブール値を格納できます。残りの7ビットは無駄になります。ブール値の配列を圧縮するためのバイナリの使用

CやJavaのような言語では、ブール値配列をint値に格納するために、 ">>"、 "〜"のようなビット演算を使用できます。しかし、浮動小数点数をint(See this question)に変換する必要があるため、JavaScriptでは非常に遅いため、JavaScriptではうまく機能しません。

私も気付いたバイナリデータを直接格納するJavaScriptののバッファ。しかし、私はブール値の配列を格納するためにそれを使用する方法を見つけることができません。私はバッファーは、より多くのものをエンコードに焦点を当てていると思う。たとえば、ブール値配列の5番目のビットをtrueに設定したい場合、私はdata |= 1<<4を実行できますが、バッファでその方法を見つけることができません。

+1

は「*それにはJavaScript *で非常に遅い動作します」 - '12からの答えと'09からの質問にだまされてはいけません。 JSエンジンは動き出しており、整数/ビット演算を最適化するのが最も簡単な方法の1つです。 – Bergi

+1

FWIW v8では、「小さな」整数(SMI)の最適化が行われています。これらの制限[ここ](https://github.com/thlorenz/v8-perf/blob/master/test/boxing.js)を読むことができます。 Buffersも使うことができますが、バイトで動作するため、インデックスごとに8つのブール値に制限されます。 – mscdex

+1

バッファにアクセスするには、[型付き配列](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray)を使用する必要があります。 'Uint8Array' – Bergi

答えて

0

はあなたが何を意味するか、このですか? (最大指数は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; 
}