CodeZine(コードジン)

特集ページ一覧

.NET Frameworkの代表的なコレクションと使い方

System.Collections名前空間直下の主なコレクション

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/03/23 14:00
目次

BitArray(ビット配列)

 あるデータについての情報を、ビット列で保持する配列コレクションです。ビット列はBitArrayの中でさらに、1をTrue、0をFalseに対応させた真偽値に置き換えられます(従って、真偽値配列コレクションと言えるかもしれません)。また、サンプルプログラムでは出力の関係上、2次元的な構造をとっているように見えますが、実際には1次元的な構造のコレクションです。

BitArrayサンプルプログラムの解説

サンプルプログラムの一部抜粋
/* 初期値 */
bool[] b_data = { true, true, false, false };
byte[] i_data1 = { 1, 2, 3, 4 };
byte[] i_data2 = { 5, 6, 7, 8 };

/* 初期値の異なる3つのビット配列 */
BitArray binaryData = new BitArray(b_data);
BitArray byteData1 = new BitArray(i_data1);
BitArray byteData2 = new BitArray(i_data2);

BitArray opData; // ビット演算結果の保存用

// 第1の例を表示
Console.Write("Binary Data : ");
for (int i = 0; i < binaryData.Count; i++)
{
    Console.Write(binaryData[i] + " ");
}
Console.WriteLine();
Console.WriteLine();

// 第2の例を表示
Console.WriteLine("Byte Data :");
for (int i = 1; i <= byteData1.Count; i++)
{
    Console.Write(byteData1[i-1] + " ");
    if (i % 8 == 0)
    {
        Console.WriteLine();
    }
}
Console.WriteLine();

// byteData1とbyteData2の間でAnd演算を行う
opData = byteData1.And(byteData2);

// And演算を行った結果を表示
Console.WriteLine("Operated Data :");
for (int i = 1; i <= opData.Count; i++)
{
    Console.Write(opData[i - 1] + " ");
    if (i % 8 == 0)
    {
        Console.WriteLine();
    }
}
Console.WriteLine();
サンプルプログラムの実行結果
Binary Data : True True False False

Byte Data :
True False False False False False False False
False True False False False False False False
True True False False False False False False
False False True False False False False False

Operated Data :
True False False False False False False False
False True False False False False False False
True True False False False False False False
False False False False False False False False

 サンプルプログラムを眺めた後、実行結果を一目見ただけでは、BitArrayについて、いったい何が起こったのか、どういう経緯でこの結果が出力されたのかよくわからないと思います。実行結果の最初に示されているのは、BitArrayに渡したbool型配列(b_Data1)そのものです。これは合点がいくと思いますが、二番目に表示されているbyte型配列を渡した結果については、真偽値の羅列のようにしか見えません。しかし、真偽値を0と1に置き換えてみると、その実体が見えてきます。

 試しに置き換えてみますと、

Byte Data :
1 0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0

 となります。勘のいい方はもう気づいたかもしれません。これは、byte型の配列(i_Data1)に納められた10進数のデータを、2進数に直したものに他ならないのです(通常見慣れた2進数の表記とは、桁表記の左右が逆なことに注意してください)。byte型はその名の通り1byte = 8bitですから、一つのデータあたり8つの真偽値で表現されるようになります。また要素の数も、1~4の4つ×8bitで、32の要素が確保されていることが見て取れます(同様にint16型を用いれば、一つのデータは16個の真偽値で表現されます)。さらに、3番目の例で示したようにBitArray同士のAndOrXorなどの論理演算を行うことが可能です。ゲームなどで、キャラクターのステータスをビット列で管理(例えば最初のビットを毒、2番目のビットをマヒに対応させるなど)したり、ストーリーの進行度を示すゲームフラグをまとめて管理する場合には重宝する機能だと思います。

BitArrayの基本的な使い方

 筆者は、サンプルに示した方法とは異なり、BitArrayのコンストラクタに欲しい要素の数を渡してデータ領域だけを確保して使うようなスタイルをとっています。明示的に初期化をせずに確保した場合には、すべての値がfalseで初期化されますので、全部falseのビット列が欲しいときにも便利です。

BitArrayを使う上での注意点

 これといって注意する点はないと思いますが、あえて挙げるならばそのサイズでしょうか。例に示したようにデータで渡すと、その型によって配列の大きさが制限されます。これを考慮しないでプログラムを書き、配列の末尾を超えて要素にアクセスしようとすると、例外が発生してプログラムが落ちてしまうのです。コンストラクタで大きさを指定することが可能なので、いきなりデータ列を渡して初期化するのではなく、利用するのに十分な大きさを確保してから使うことをオススメします。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 太田 晃(オオタ アキラ)

    &nbsp;ブログ(http://repse.blogspot.com/)では、coLinux上にMinGWを用いてクロスコンパイル環境を構築し、そのうえでSDLやOpenGLを使ってWindows向けのプログラムを書くとか、海外のソフトウェアを(勝手に)日本語化するとか、Windowsのインデック...

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5