C# Битовый массив (BitArray)
BitArray — это коллекция в C#, используемая для представления набора битовых значений.
BitArray принадлежит пространству имен System.Collections и в основном используется для обработки двоичных данных или выполнения битовых операций.
По сравнению с использованием логического массива (bool[]), BitArray более эффективен, поскольку хранит каждый бит в компактном виде.
Класс BitArray управляет компактным массивом битовых значений, представленных с помощью логических значений.
true означает, что бит включён (1), false означает, что бит выключен (0)。
Когда нужно хранить биты, но количество битов заранее неизвестно, используйте BitArray.
Вы можете использоватьцелочисленный индексдля доступа к элементам коллекции BitArray, при этом индекс начинается с нуля.
Методы и свойства класса BitArray
В таблице ниже перечисленыBitArrayнекоторые часто используемые элементы классаСвойство:
| Имя атрибута | Type | Описание |
|---|---|---|
Count | int | ПолучитьBitArrayКоличество содержащихся битов (только для чтения). |
Length | int | Получить или задатьBitArrayКоличество битов в (поддерживает динамическое изменение размера). |
IsReadOnly | bool | Возвращает значение, указывающее, является лиBitArrayдоступным только для чтения (всегдаfalse)。 |
SyncRoot | object | Возвращает объект, используемый для синхронизации доступа кBitArrayдоступ. |
IsSynchronized | bool | Возвращает значение, указывающее, является ли доступ кBitArrayсинхронизированным (потокобезопасным). |
Item[int index] | bool | Возвращает или задаёт значение бита по указанному индексу (доступ через индексатор). |
Доступ к свойству:
BitArray bits = new BitArray(8); // 创建 8 位的 BitArray,所有位默认为 false Console.WriteLine(bits.Length); // 输出:8 bits.Length = 10; // 修改长度为 10,新增的位默认为 false
В таблице ниже перечисленыBitArrayнекоторые часто используемые методы классаMethods:
| Название метода | Тип возвращаемого значения | Описание |
|---|---|---|
And(BitArray) | BitArray | Побитовая операция AND над двумяBitArrayвыполняет операцию AND над соответствующими битами, изменяет текущий экземпляр на месте и возвращает сам текущий экземпляр. |
Or(BitArray) | BitArray | Побитовая операция OR над двумяBitArrayвыполняет операцию OR над соответствующими битами, изменяет текущий экземпляр на месте и возвращает сам текущий экземпляр. |
Xor(BitArray) | BitArray | Побитовая операция XOR над двумяBitArrayвыполняет операцию XOR над соответствующими битами, изменяет текущий экземпляр на месте и возвращает сам текущий экземпляр. |
Not() | BitArray | Побитовая операция NOT, которая инвертирует каждый бит текущего экземпляра, изменяет его на месте и возвращает сам текущий экземпляр. |
Set(int index, bool value) | void | Устанавливает бит по указанному индексу в указанное значение (trueилиfalse)。 |
SetAll(bool value) | void | Устанавливает все биты в указанное значение (trueилиfalse)。 |
Get(int index) | bool | Возвращает значение бита по указанному индексу. |
Clone() | object | Создает текущийBitArrayПоверхностная копия (дубликат) чего-либо. |
CopyTo(Array array, int index) | void | будетBitArrayКопирует содержимое в указанный массив, начиная с указанного индекса. |
Equals(object obj) | bool | Определяет, равен ли указанный объект текущемуBitArray。 |
GetEnumerator() | IEnumerator | Возвращает перечислитель, который выполняет итерацию поBitArrayбит в. |
Использование метода:
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)Создать копию.
Пример
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
// Инициализация двух BitArray для хранения двоичных битов
BitArray ba1 = new BitArray(new byte[] { 60 }); // 60 = 00111100
BitArray ba2 = new BitArray(new byte[] { 13 }); // 13 = 00001101
// Вывести содержимое ba1 и ba2
Console.WriteLine("Битовый массив ba1 (60):");
PrintBitArray(ba1);
Console.WriteLine("Битовый массив ba2 (13):");
PrintBitArray(ba2);
// Выполнить операцию AND и вывести результат
// And/Or/Xor изменяют экземпляры, которые их вызывают, на месте; создайте копию ba1 перед операцией.
BitArray baAnd = new BitArray(ba1);
baAnd.And(ba2); // 60 & 13 = 12
Console.WriteLine("Битовый массив после операции AND (12):");
PrintBitArray(baAnd);
// Выполнить операцию OR и вывести результат
BitArray baOr = new BitArray(ba1); // Снова скопировать исходный ba1.
baOr.Or(ba2); // 60 | 13 = 61
Console.WriteLine("Битовый массив после операции OR (61):");
PrintBitArray(baOr);
// Выполнить операцию XOR и вывести результат
BitArray baXor = new BitArray(ba1); // Продолжить копирование исходного ba1.
baXor.Xor(ba2); // 60 ^ 13 = 49
Console.WriteLine("Битовый массив после операции XOR (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
Другие расширения