C# ビット配列(BitArray)
BitArray は、C# において一連のビット(bit)値を表すために使用されるコレクションです。
BitArray は System.Collections 名前空間に属し、主にバイナリデータの処理やビット操作に使用されます。
ブール配列(bool[])を使用する場合と比較して、BitArray は各ビットをコンパクトに格納するため、より効率的です。
BitArray クラスは、ブール値を使用して表されるコンパクトなビット値の配列を管理します。
true はビットがオン(1)であることを示し、false はビットがオフ(0)であることを示します。。
ビットを格納する必要があるが、事前にビット数がわからない場合は、ビット配列を使用します。
ビット配列コレクションの各項目にアクセスするには、整数インデックスを使用します。インデックスは 0 から始まります。
BitArray クラスのメソッドとプロパティ
次の表に、BitArrayBitArray クラスの一般的なプロパティを示します。:
| プロパティ名 | 型 | 説明 |
|---|---|---|
Count | int | 取得BitArray内のビット数(読み取り専用)。 |
Length | int | 取得または設定BitArray内のビット数(動的なサイズ変更をサポート)。 |
IsReadOnly | bool | 値を取得します。この値は、BitArray読み取り専用かどうかを示します(常に false)。false)。 |
SyncRoot | object | オブジェクトを取得します。これは、BitArrayBitArray へのアクセスを同期するために使用されます。 |
IsSynchronized | bool | 値を取得します。この値は、BitArrayBitArray へのアクセスが同期されているかどうか(スレッドセーフ)を示します。 |
Item[int index] | bool | 指定したインデックス位置のビットの値を取得または設定します(インデクサーを使用してアクセス)。 |
プロパティアクセス:
BitArray bits = new BitArray(8); // 创建 8 位的 BitArray,所有位默认为 false Console.WriteLine(bits.Length); // 输出:8 bits.Length = 10; // 修改长度为 10,新增的位默认为 false
次の表に、BitArrayBitArray クラスの一般的なメソッドを示します。:
| メソッド名 | 戻り値の型 | 説明 |
|---|---|---|
And(BitArray) | BitArray | ビットごとの AND 演算。2 つの BitArray のBitArray対応するビットに対して AND 演算を実行し、現在のインスタンスをその場で変更して、現在のインスタンス自体を返します。 |
Or(BitArray) | BitArray | ビットごとの OR 演算。2 つの BitArray のBitArray対応するビットに対して OR 演算を実行し、現在のインスタンスをその場で変更して、現在のインスタンス自体を返します。 |
Xor(BitArray) | BitArray | ビットごとの XOR 演算。2 つの BitArray のBitArray対応するビットに対して XOR 演算を実行し、現在のインスタンスをその場で変更して、現在のインスタンス自体を返します。 |
Not() | BitArray | ビットごとの NOT 演算。現在のインスタンスの各ビットを反転し、その場で変更して現在のインスタンス自体を返します。 |
Set(int index, bool value) | void | 指定したインデックス位置のビットを指定した値(value)に設定します。true 或 false)。 |
SetAll(bool value) | void | すべてのビットを指定した値(value)に設定します。true 或 false)。 |
Get(int index) | bool | 指定したインデックス位置のビットの値を取得します。 |
Clone() | object | 現在のBitArrayBitArray のシャローコピー(コピー)を作成します。 |
CopyTo(Array array, int index) | void | 将 BitArrayBitArray の内容を、指定したインデックスから指定した配列にコピーします。 |
Equals(object obj) | bool | 指定したオブジェクトが現在の BitArray と等しいかどうかを判断します。BitArray。 |
GetEnumerator() | IEnumerator | 列挙子を返します。これは、BitArrayBitArray 内のビットを反復処理するために使用されます。 |
メソッドの使用:
BitArray bits = new BitArray(8, false); // 创建 8 位的 BitArray,初始值全部为 false bits.Set(0, true); // 设置第 0 位为 true Console.WriteLine(bits.Get(0)); // 输出:True bits.SetAll(true); // 将所有位设置为 true
例
次の例は、ビット配列(BitArray)の使用法を示しています。
BitArray ではインデックス 0 はバイナリ数の最下位ビットに対応するため、インデックスの正順で走査して得られるビット列は通常の記述順と逆になり、次の例では逆順で走査して出力しています。
And()、Or()、Xor() などのメソッドは呼び出し元のインスタンスをその場で変更し、自身を返すため、毎回の演算の前にコピーコンストラクタを使用して
new BitArray(ba1)コピーを作成します。
数値 13 の 2 つのビット順の比較
通常の記述順(上位ビットが先):
0
ビット7
0
ビット6
0
ビット5
0
ビット4
1
ビット3
1
ビット2
0
ビット1
1
ビット0
BitArray のインデックス順(インデックス 0 が最下位ビットに対応):
1
インデックス0
0
インデックス1
1
インデックス2
1
インデックス3
0
インデックス4
0
インデックス5
0
インデックス6
0
インデックス7
同じ数値 13 でも、インデックスの正順で BitArray を走査すると 1 0 1 1 0 0 0 0 となり、通常の記述順とは正反対になるため、例では逆順で走査して出力しています。
例
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
// バイナリビットを格納するための 2 つの BitArray を初期化する
BitArray ba1 = new BitArray(new byte[] { 60 }); // 60 = 00111100
BitArray ba2 = new BitArray(new byte[] { 13 }); // 13 = 00001101
// ba1 と ba2 の内容を出力する
Console.WriteLine("Bit array ba1 (60):");
PrintBitArray(ba1);
Console.WriteLine("Bit array ba2 (13):");
PrintBitArray(ba2);
// AND 演算を実行し、結果を出力する
// And/Or/Xor は呼び出し元のインスタンスをその場で変更するため、演算の前に ba1 のコピーを作成する
BitArray baAnd = new BitArray(ba1);
baAnd.And(ba2); // 60 & 13 = 12
Console.WriteLine("Bit array after AND operation (12):");
PrintBitArray(baAnd);
// OR 演算を実行し、結果を出力する
BitArray baOr = new BitArray(ba1); // 元の ba1 を再度コピーする
baOr.Or(ba2); // 60 | 13 = 61
Console.WriteLine("Bit array after OR operation (61):");
PrintBitArray(baOr);
// XOR 演算を実行し、結果を出力する
BitArray baXor = new BitArray(ba1); // 元の ba1 をさらにコピーする
baXor.Xor(ba2); // 60 ^ 13 = 49
Console.WriteLine("Bit array after XOR operation (49):");
PrintBitArray(baXor);
Console.ReadKey();
}
// 逆順で走査し、出力を「上位ビットが先」という記述習慣に合わせる
static void PrintBitArray(BitArray bitArray)
{
for (int i = bitArray.Length - 1; i >= 0; i--)
{
Console.Write($"{(bitArray[i] ? 1 : 0)} ");
}
Console.WriteLine("\n");
}
}
}
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
// バイナリビットを格納するための 2 つの BitArray を初期化する
BitArray ba1 = new BitArray(new byte[] { 60 }); // 60 = 00111100
BitArray ba2 = new BitArray(new byte[] { 13 }); // 13 = 00001101
// ba1 と ba2 の内容を出力する
Console.WriteLine("Bit array ba1 (60):");
PrintBitArray(ba1);
Console.WriteLine("Bit array ba2 (13):");
PrintBitArray(ba2);
// AND 演算を実行し、結果を出力する
// And/Or/Xor は呼び出し元のインスタンスをその場で変更するため、演算の前に ba1 のコピーを作成する
BitArray baAnd = new BitArray(ba1);
baAnd.And(ba2); // 60 & 13 = 12
Console.WriteLine("Bit array after AND operation (12):");
PrintBitArray(baAnd);
// OR 演算を実行し、結果を出力する
BitArray baOr = new BitArray(ba1); // 元の ba1 を再度コピーする
baOr.Or(ba2); // 60 | 13 = 61
Console.WriteLine("Bit array after OR operation (61):");
PrintBitArray(baOr);
// XOR 演算を実行し、結果を出力する
BitArray baXor = new BitArray(ba1); // 元の ba1 をさらにコピーする
baXor.Xor(ba2); // 60 ^ 13 = 49
Console.WriteLine("Bit array after XOR operation (49):");
PrintBitArray(baXor);
Console.ReadKey();
}
// 逆順で走査し、出力を「上位ビットが先」という記述習慣に合わせる
static void PrintBitArray(BitArray bitArray)
{
for (int i = bitArray.Length - 1; i >= 0; i--)
{
Console.Write($"{(bitArray[i] ? 1 : 0)} ");
}
Console.WriteLine("\n");
}
}
}
上記のコードをコンパイルして実行すると、次の結果が生成されます:
Bit array ba1 (60): 0 0 1 1 1 1 0 0 Bit array ba2 (13): 0 0 0 0 1 1 0 1 Bit array after AND operation (12): 0 0 0 0 1 1 0 0 Bit array after OR operation (61): 0 0 1 1 1 1 0 1 Bit array after XOR operation (49): 0 0 1 1 0 0 0 1
その他の拡張
C# コレクション