Как использовать тип BitVector32 в .NET
Опубликовано в Полезные советы
Если нужно оперировать отдельными битами и секциями битов в 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. Из-за этого он занимает больше места в памяти. И он не позволяет создавать секции: вам придётся оперировать каждым битом отдельно. Но у него большая гибкость при создании, имеется несколько перегруженных версий конструктора под разные нужды.