Рейтинг@Mail.ru

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

Print Friendly, PDF & Email

Если нужно оперировать отдельными битами и секциями битов в 32-разрядных числах, в .NET существует тип System.Collections.Specialized.BitVector32. Его использование сводится к тому, что сначала необходимо определить секции и/или маски. Маски используются для оперирования отдельными битами, а секции – для оперирования группами битов внутри числа.

Dim b0 As Integer = BitVector32.CreateMask() 'инициализация битовых масок - нулевой (младший) бит
Dim b1 As Integer = BitVector32.CreateMask(b0) '1-ый бит
Dim b2 As Integer = BitVector32.CreateMask(b1) '2-ой бит
            
Dim s0 As BitVector32.Section = BitVector32.CreateSection(1)   'бит 0
Dim s6_1 As BitVector32.Section = BitVector32.CreateSection(&B11_1111, s0)  'биты 1..6
Dim s8_7 As BitVector32.Section = BitVector32.CreateSection(&B11, s6_1)  'биты 7..8
Dim s9 As BitVector32.Section = BitVector32.CreateSection(1, s7_8)  'бит 9

Dim s1 As BitVector32.Section = BitVector32.CreateSection(1, s0) 'бит 1
Dim s9_2 As BitVector32.Section = BitVector32.CreateSection(&B1111_1111, s1) 'биты 2..9

Пример использования секций битов:

Dim vector As New BitVector32(&HFFFF) 'создаём 32-битный вектор и инициализируем числом 0xFFFF
vector(s6_1) = 26 'задаём значение для секции битов 1..6
vector(s9) = 1 'задаём значение для секции 9, т.е. 9-го разряда

Для управления отдельными битами:

vector(b0) = 0 'задаём значение "0" младшего (0-го) бита
vector(b1) = 1 'задаём значение "1" для 1-го бита

vector(s1) = 1 'то же, что и предыдущая строка, только доступ через секцию

Если вы присвоите секции значение, большее, чем определено количеством битов в секции, «лишние» биты будут отрезаны. Например, при попытке записать в секцию s6_1 число 92 (0101_1100), оно будет урезано до 6-ти бит, т.е. получится число 28 (01_1100).

В .NET также существует тип BitArray, обладающий похожей функциональностью. Разница в том, что размер числа не ограничен 32-мя разрядами, а отдельные биты представлены типом Boolean. Из-за этого он занимает больше места в памяти. И он не позволяет создавать секции: вам придётся оперировать каждым битом отдельно. Но у него большая гибкость при создании, имеется несколько перегруженных версий конструктора под разные нужды.

Поблагодарить автора:

Поделиться

Print Friendly, PDF & Email