C# Битовый массив (BitArray)

Коллекции C#

BitArray — это коллекция в C#, используемая для представления набора битовых значений.

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

По сравнению с использованием логического массива (bool[]), BitArray более эффективен, поскольку хранит каждый бит в компактном виде.

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

true означает, что бит включён (1), false означает, что бит выключен (0)。

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

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

Методы и свойства класса BitArray

В таблице ниже перечисленыBitArrayнекоторые часто используемые элементы классаСвойство:

Имя атрибутаTypeОписание
CountintПолучитьBitArrayКоличество содержащихся битов (только для чтения).
LengthintПолучить или задатьBitArrayКоличество битов в (поддерживает динамическое изменение размера).
IsReadOnlyboolВозвращает значение, указывающее, является лиBitArrayдоступным только для чтения (всегдаfalse)。
SyncRootobjectВозвращает объект, используемый для синхронизации доступа кBitArrayдоступ.
IsSynchronizedboolВозвращает значение, указывающее, является ли доступ к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)Создать копию.

Сравнение двух порядков битов для значения 13
Обычный порядок записи (сначала старший разряд):
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)
        {
            // Инициализация двух 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

Коллекции C#

Другие расширения