Как использовать BitArray в .NET 7

автор vadim


Класс BitArray в .NET 7 — это надежная структура данных, которая хранит биты данных и манипулирует ими. Каждый элемент в BitArray может содержать только один бит (0 или 1), представленный как false или true, где false указывает, что бит выключен (0), а true указывает, что бит включен (1). BitArrays может хранить флаги или эффективно выполнять побитовые операции с данными.

В этой статье рассказывается об использовании BitArray в C# с соответствующими примерами кода, где это применимо. Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте проект консольного приложения в Visual Studio.

Прежде всего давайте создадим проект консольного приложения .NET Core в Visual Studio. Предполагая, что в вашей системе установлена ​​Visual Studio 2022, выполните действия, описанные ниже, чтобы создать новый проект консольного приложения .NET Core в Visual Studio.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В показанном ниже окне «Настройка нового проекта» укажите имя и местоположение нового проекта.
  6. Нажмите “Далее
  7. В следующем окне «Дополнительная информация» выберите «.NET 7 (Предварительная версия)» в качестве версии Framework, которую вы хотите использовать.
  8. Нажмите Создать.

Мы будем использовать этот проект консольного приложения .NET 7 для работы с BitArray в последующих разделах этой статьи.

Что такое битовый массив?

BitArray — это тип, содержащийся в пространстве имен System.Collections и представляющий компактный массив битовых значений. Эти значения выражаются как логические значения, т. е. true и false. Здесь значение true означает, что бит включен, а значение false означает, что бит выключен.

Поскольку класс BitArray расположен в пространстве имен System.Collections, вам потребуется включить в код директиву using для этого пространства имен. Класс BitArray объявлен в пространстве имен System.Collections, как показано ниже.

public sealed class BitArray : ICloneable, System.Collections.ICollection

Создайте BitArray в .NET 7.

Вы можете создать BitArray определенного размера и заполнить его всеми ложными значениями, как показано в приведенном ниже фрагменте кода.

var bitArray = new BitArray(10);

Вы также можете передать список логических значений, чтобы создать BitArray определенного размера и установить значения.

var bitArray = new BitArray(new bool[] {true, false, true});

После создания BitArray вы можете получить доступ к отдельным битам и манипулировать ими с помощью индексатора. Индексатор ожидает целое число и вернет или установит значение этого бита.

bitArray[0] = true //sets the first bit to true
bitArray[1] = false //sets the second bit to false
bitArray[0] //returns the value of the first bit (as a bool)

Следующий фрагмент кода можно использовать для создания BitArray, установки значений его элементов, а затем получения и отображения значения определенного индекса в BitArray.

BitArray bitArray = new BitArray(5);
bitArray[0] = true;
bitArray[1] = false;
bitArray[2] = true;
bitArray[3] = false;
bitArray[4] = false;
Console.WriteLine(bitArray.Get(2));
Console.WriteLine(bitArray.Get(4));

Когда вы выполните приведенный выше фрагмент кода, значения true и false будут отображаться в окне консоли, как показано на рисунке 1.

битовый массив 01 ИДГ

Рисунок 1.

Манипулирование битами в BitArray

Вы можете манипулировать битами в BitArray, используя его индекс или методы Get и Set класса BitArray. Чтобы установить или получить несколько битов из BitArray, вы можете использовать методы SetAll() и GetAll(), как показано в приведенном ниже фрагменте кода.

bitArray.SetAll(false); //set all bits of the bit array to 0
bitArray.Set(0, true); //set first bit of the bit array to 1
bitArray.Set(1, false); //set the second bit of the bit array to 0
bool result = (bitArray[0] == 1); //verify if first bit is equal to 1

Проверьте, доступен ли BitArray только для чтения

Если вам нужно проверить, доступен ли BitArray только для чтения, вы можете использовать свойство IsReadOnly. Это свойство возвращает логическое значение, указывающее, доступен ли BitArray только для чтения. В следующем фрагменте кода показано, как проверить, доступен ли BitArray только для чтения.

BitArray bitArray = new BitArray(new byte[] { 0, 1, 0, 1, 0 });
Console.WriteLine(bitArray.IsReadOnly);

Когда вы выполните приведенный выше фрагмент кода, в окне консоли отобразится текст «False».

Свойства длины и количества в BitArray

Свойство длины BitArray возвращает количество битов в массиве. Свойство Count возвращает количество значений true и false в BitArray. Обратите внимание, что свойство Длина всегда возвращает общее количество битов в массиве, даже если все они ложны. Другими словами, свойства Длина и Количество будут отображать идентичные значения для BitArray.

Следующий фрагмент кода показывает, как получить длину и количество BitArray.

var bitArray = new BitArray(new bool[] { true, false, true, false });
Console.WriteLine("Length: " + bitArray.Length);
Console.WriteLine("Count: " + bitArray.Count);

Когда вы выполните приведенный выше код, выходные данные будут аналогичны показанным на рисунке 2.

битовый массив 02 ИДГ

Фигура 2.

Возможно, вы захотите проверить, синхронизирован ли ваш экземпляр BitArray. Это можно сделать, вызвав свойство IsSynchronized экземпляра, которое вернет true, если BitArray синхронизирован, и false в противном случае.

Выполнение операций И, ИЛИ и НЕ в BitArray.

В следующем листинге кода показано, как можно выполнить побитовую операцию И над двумя экземплярами BitArray. Побитовая операция И возвращает истину (или 1), если оба операнда истинны, и возвращает ложь в противном случае. Побитовая операция ИЛИ возвращает true, если один или оба операнда имеют значение true, и false в противном случае.

var bitArray1 = new BitArray(new bool[] { true, false, true, false, true });
var bitArray2 = new BitArray(new bool[] { true, false, true, true, true });
bitArray1.Set(0, true);
bitArray1.Set(1, false);
bitArray1.Set(2, true);
bitArray1.Set(3, true);
bitArray1.Set(4, false);
bitArray2.Set(0, true);
bitArray2.Set(1, true);
bitArray2.Set(2, false);
bitArray2.Set(3, true);
bitArray2.Set(4, false);
bitArray1.And(bitArray2);
Console.WriteLine("Displaying the elements of bitArray1 after AND operation");
for (int i = 0; i < bitArray1.Count; i++)
{
    Console.Write(bitArray1[i] + "\t");
}

Когда вы выполняете приведенный выше код, значение каждого элемента bitArray1 будет отображаться после операции AND.

битовый массив 03 ИДГ

Рисунок 3.

Чтобы выполнить побитовую операцию ИЛИ над двумя BitArrays, вы можете просто заменить оператор AND оператором OR в предыдущем примере. Другими словами, замените bitArray1.And(bitArray2) на bitArray1.Or(bitArray2).

var bitArray1 = new BitArray(new bool[] { true, false, true, false, true });
var bitArray2 = new BitArray(new bool[] { true, false, true, true, true });
bitArray1.Set(0, true);
bitArray1.Set(1, false);
bitArray1.Set(2, true);
bitArray1.Set(3, true);
bitArray1.Set(4, false);
bitArray2.Set(0, true);
bitArray2.Set(1, true);
bitArray2.Set(2, false);
bitArray2.Set(3, true);
bitArray2.Set(4, false);
bitArray1.Or(bitArray2);
Console.WriteLine("Displaying the elements of bitArray1 after OR operation");
for (int i = 0; i < bitArray1.Count; i++)
{
    Console.Write(bitArray1[i] + "\t");
}

Выполнение операции NOT над BitArray изменит все истинные элементы на ложные и наоборот. Следующий фрагмент кода изменит элементы bitArray1 с { true, false, false, true, false } на { false, true, true, false, true }.

bitArray1.Not();

Распространенное использование BitArrays

Существует ряд распространенных случаев использования BitArray, например, для выполнения побитовых операций для управления изображением. Цвет каждого пикселя изображения определяется определенным количеством бит. Изменение цвета пикселя требует манипулирования составляющими его битами. Используя BitArray, легко манипулировать отдельными битами массива.

BitArray также часто используется при работе с сетевыми пакетами. Пакеты содержат большой объем данных, которые могут быть отформатированы как биты или байты в зависимости от протокола. Вы можете легко извлекать и манипулировать битами, содержащимися в каждом пакете, с помощью BitArray.

Вы также можете использовать BitArray для представления логических значений в вашем приложении. Поступая таким образом, вы можете снизить требования к памяти и хранилищу. BitArray занимает 1/8 места, занимаемого bool, поскольку BitArray хранит только один бит для каждого значения. Кроме того, хотя байт может содержать только восемь значений, а целое число — только 32, BitArray может содержать произвольное количество логических значений. Если вы храните огромный объем данных, эта разница может быть весьма значительной.

Наконец, когда дело доходит до обработки огромной коллекции, преимущества BitArray и побитовой обработки станут очевидны, как только вы начнете извлекать данные из памяти. Например, будет значительная разница в производительности между BitArray из 10 000 элементов и списком из 10 000 элементов. Для List потребуется в восемь раз больше операций чтения памяти, чем для BitArray.

Related Posts

Оставить комментарий