特殊コレクションを利用して軽量のブール配列を作成する。(BitVector32,BitArray)

C#,VB.NETのブール値(bool,Boolean)はTrueとFalseの2値しか保持しませんが、1変数あたり4バイト(32Bit)のメモリ量を必要とします。
簡単に言うと残りの31ビットは無駄な状態となります。大量のブール値を保持する場合、この非効率さが問題となるケースがあります。

そうした場合に利用できるのがBitVector32と、BitArrayです。

■BitVector32
BitVector32は1ビットずつブール値で取り扱えるようにした32ビットの構造体です。4バイトしかメモリを消費しませんが、32個のブール値を取り扱えます。但し、配列の添え字がMask値のため少し扱いにくいということと、32個を超えるブール値は1変数では管理できません。


using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;

namespace ThreadSafeCollection
{
class Program
{

static void Main(string[] args)
{

BitVector32 bitVec = new BitVector32();

bitVec[1] = true;
bitVec[2] = true;
bitVec[4] = true;
bitVec[8] = true;
bitVec[16] = true;

}
}
}

5個分のブール値を取り扱うサンプルですが、CreateMaskで得られたMask値を算出する方法もあります。


using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;

namespace ThreadSafeCollection
{
class Program
{

static void Main(string[] args)
{

BitVector32 bitVec = new BitVector32();

bitVec[1] = true;
bitVec[2] = true;
bitVec[4] = true;
bitVec[8] = true;
bitVec[16] = true;

}
}
}

■BitArray
BitArrayはクラスであるため、クラスのオーバーヘッド分メモリのサイズが大きくなりますがブール値の部分は1ビットで管理していることと、BitVector32のように32個といった要素数の制限もないため、配列のサイズを任意の大きさに設定することができる利点があります。また、配列の添え字もMask値ではないため使いやすい配列です。


using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.Specialized;

namespace ThreadSafeCollection
{
class Program
{

static void Main(string[] args)
{

BitArray bitArr = new BitArray(100);

bitArr[0] = true;
bitArr[1] = true;
bitArr[2] = true;
bitArr[3] = true;
bitArr[4] = true;

}
}
}