7.3 ビットベクトルによる集合



Maxが小さければ,0,1, 2, …,Max−1を
符号なし整数のビット位置で示すことで
ビットの0,1で集合を表現することができます。
たとえば,16個の集合を表現するには,
以下のような16ビット長の整数1個で表現できます。
      

集合演算も,
整数同士のビット演算AND,ORで代替することができます。

差集合は,

   A−B = A And ( Not B)

とすることができます。

CやC++では,ビットのセットは
先頭ビットまたは末尾ビットをオンにして,
シフト演算を行うことで目的とするビットのみをオンにし,
OR演算することでビットをセットできます。

しかし,C#では,BitArrayクラスを使うと,
まるで配列と同じような感覚でビットをセットしたり,
取り出すことができます。

演算もBitArrayのOr,And,Notを使って実装することができます。


[プログラム例] フォーム定義

// データ宣言
BitArray myBA1 = new BitArray(10,false);
BitArray myBA2 = new BitArray(10,false);
BitArray myBA3 = new BitArray(10,false);

// 表示
private string Bit列(BitArray A)
{
  string S="";
  for(int i=0;i<A.Length;i++)
  {
    if(A[i]) S += "1";
    else S +="0";
  }
  return S;
}
private void 表示()
{
  lblDsp1.Text=Bit列(myBA1);
  lblDsp2.Text=Bit列(myBA2);
  lblDsp3.Text=Bit列(myBA3);
}

// 初期表示
private void Form1_Load(object sender, System.EventArgs e)
{  表示(); }

// 要素設定
private BitArray AddMember(BitArray BA,int Member)
{
  BitArray B=BA;
  if(Member < BA.Length) B[Member]=true;
  return B;
}

// 要素の削除
private BitArray DeleteMember(BitArray BA,int Member)
{
  BitArray B=BA;
  if(Member < BA.Length) B[Member]=false;
  return B;
}

// BA1に要素を追加
private void button1_Click(object sender, System.EventArgs e)
{  myBA1=AddMember(myBA1,int.Parse(textBox1.Text)); 表示(); }

// BA2に要素を追加
private void button2_Click(object sender, System.EventArgs e)
{ myBA2=AddMember(myBA2,int.Parse(textBox2.Text)); 表示(); }

// BA1に要素があるかどうか?
private void button3_Click(object sender, System.EventArgs e)
{ MessageBox.Show(myBA1[int.Parse(textBox1.Text)].ToString()); }

// BA2に要素があるかどうか?
private void button4_Click(object sender, System.EventArgs e)
{ MessageBox.Show(myBA2[int.Parse(textBox2.Text)].ToString()); }

// BA1 Or BA2 private void button5_Click(object sender, System.EventArgs e)
{ BitArray A=(BitArray)myBA1.Clone(); myBA3=A.Or(myBA2);表示(); }

// BA3 = BA1 And BA2
private void button6_Click(object sender, System.EventArgs e)
{ BitArray A=(BitArray)myBA1.Clone(); myBA3=A.And(myBA2);表示(); }

// BA3 = BA1 - BA2
private void button7_Click(object sender, System.EventArgs e)
{
   BitArray A=(BitArray)myBA1.Clone();
   BitArray B=(BitArray)myBA2.Clone();
   myBA3=A.And(B.Not());表示();
}

// BA1から要素の削除
private void button8_Click(object sender, System.EventArgs e)
{ myBA1=DeleteMember(myBA1,int.Parse(textBox1.Text)); 表示(); }

// BA2から要素の削除
private void button9_Click(object sender, System.EventArgs e)
{ myBA2=DeleteMember(myBA2,int.Parse(textBox2.Text)); 表示(); }




1. 基本的なアルゴリズム

2. 基本的なデータ構造

3. 操作を伴うデータ構造

4. 探索

5. 再帰的アルゴリズム

6. ソート

7. 集合

8. 文字列処理

9. 色々なアルゴリズム


上のタイトルをクリックします