Сообщения

Показаны сообщения с ярлыком "побитовые сдвиги"

Битовый вектор

В посте О битовых операциях  были рассмотрены логические побитовые операции и побитовые сдвиги. В качестве примеров были взяты битовые флаги и множества. Если применения битовых флагов вообщем то понятно, то для множества необходима структура данных и набор алгоритмов по работе с ней. В книге Донован А. Керниган Б. - Язык программирования Go приведен пример битового вектора. Такая структура хорошо подходит для множества небольших положительных чисел над которым часто проводят операции объединения, пересечения, разность и пр. Реализуем на Go структуру и основные методы. Тип вектора имеет одно поле. Срез беззнаковых целочисленных значений, каждый бит которых представляет возможный элемент множества. type IntSet struct { words [] uint } Нам понадобится узнать размер слова const sizeWord = 32 << (^ uint ( 0 ) >> 63 ) На 32 разрядных платформах sizeWord будет равен 32, на 64 соответственно 64. Когда не часто работаешь с битовыми операциями может...

О битовых операциях

Число в двоичной записи можно использовать как множество или битовые флаги. В таком виде проще познакомится с побитовыми операциями. Возьмем для примера число 168, в двоичной записи это (1010 1000). 7 6 5 4 3 2 1 0 1 0 1 0 1 0 0 0 Получается множество {7, 5, 3} или можно сказать что включен флаг 7, 5, 3 Логические побитовые операции Побитовое НЕ Инвертирует состояние каждого бита. Унарный префиксный оператор ^ ^(1010 1000)=(0101 0111) Побитовое И Логическое & к каждой паре битов. Если оба бита равны 1 то результат будет 1, в остальных случаях 0. Бинарный оператор & Для множества это операция пересечение (1010 1000) = {7, 5, 3} (0110 1001) = {6, 5, 3, 0} (1010 1000)&(0110 1001)=(0010 1000) = {5, 3} Для битовых флагов позволяет узнать включены ли нужные флаги flags =  1010 1000 mask = 0000 1000 - хотим узнать включен ли 3й бит (flags&mask)==mask (flags&mask) = (1010 1000)&(0000 1000)=(0000 1000) сравниваем маску ...