Изменения

Перейти к: навигация, поиск

Побитовые операции

1045 байт добавлено, 00:25, 7 марта 2016
Применение для решения задач
==Применение для решения задач==
*'''''===Проверка на то, является ли число степенью двойки'''''*:Если выражение <tex>(x\ \&\ (x - 1))</tex> равно нулю, то число <tex>x</tex> является степенью двойки <tex>(x \not= 0)</tex>.*'''''Проверка на то, что в битовой записи числа нет двух единиц, идущих подряд'''''*:Если выражение <tex>(x\ \&\ (x \ll 1))</tex> равно нулю, то в битовой записи числа <tex>x</tex> нет двух единиц, идущих подряд.*'''''Номер младшего единичного бита'''''*:Число, полученное в результате операции <tex>x\ \&\ (\sim x + 1)</tex> будет равно номеру младшего единичного бита в числе <tex>x</tex>.*'''''Работа с битовыми масками'''''*:Храним подмножества множества из <tex>32, 64</tex> или <tex>128</tex> фиксированных элементов. Значение каждого бита позволяет понять, включен элемент в множество или нет. Тогда легко сделать следующее: найти дополнение <tex>(\sim mask)</tex>, пересечение <tex>(mask_1\ \&\ mask_2)</tex>, объединение <tex>(mask_1 \mid mask_2)</tex> множеств, установить бит по номеру <tex>(mask \mid (1 \ll x))</tex>, снять бит по номеру <tex>(mask\ \&\ \sim(1 \ll x))</tex>.*'''''Определение знака числа'''''==
<code>
sign answer = (v x && != 0) | -('''int''')(('''unsigned int''')(('''int''')v) >> (''sizeof''x & ('''int''') * CHAR_BIT x - 1)); <font color = green>// Or, for more speed but less portability: sign если answer = (v != 0) | (v >> (''sizeof''('''int''') * CHAR_BIT - 1)); // -1, 0, or +1 /то число x является степенью двойки</ Or, for portability, brevity, and (perhaps) speed: sign = (v font> 0) - (v < 0); // -1, 0, or +1
</code>
*'''''Кодирование информации'''''===Работа с битовыми масками===Для работы с подмножествами удобно использовать битовые маски. Применяя побитовые операции легко сделать следующее: найти дополнение <tex>(\sim mask)</tex>, пересечение <tex>(mask_1\ \&\ mask_2)</tex>, объединение <tex>(mask_1 \mid mask_2)</tex> множеств, установить бит по номеру <tex>(mask \mid (1 \ll x))</tex>, снять бит по номеру <tex>(mask\ \&\ \sim(1 \ll x))</tex>.===Определение знака числа===Поскольку при сдвиге вправо на освобождающиеся позиции устанавливается бит знака, знак числа можно определить следующим образом:
<code>
<font color = green>// метод в этом и следующих примерах в константе '''CHAR_BIT''' хранится количество битов в одном байте</font> sign = x >> (''sizeof''('''int''') * '''CHAR_BIT''' - 1) <font color = green>// если x < 0, результатом будет -1, иначе 0 </font>  sign = (x != 0) | (x >> (''sizeof''('''int''') * '''CHAR_BIT''' - 1)) <font color = green>// результатом будет -1, 0, или +1 // для отрицательного, равного нулю и положительного числа x соответственно</font></code>Используя побитовые операции можно также узнать, различны ли знаки двух переменных:<code> '''bool''' result = ((x <tex>\oplus</tex> y) < 0) <font color = green>// значение переменной result == ''true'', если знаки переменных x и y различны</font></code>===Вычисление модуля числа без использования условного оператора===<code> mask = x >> ''sizeof''('''int''') * '''CHAR_BIT''' - 1 abs = (x + mask) <tex>\oplus</tex> mask <font color = green>// другой способ сделать то же самое:</font> abs = (x <tex>\oplus</tex> mask) - mask</code>===Нахождение минимума и максимума из двух чисел без использования условного оператора===Этот способ корректен только если можно утверждать, что величина <tex>(x - y)</tex> лежит между граничными значениями типа int.<code> min = y + ((x - y) & ((x - y) >> (''sizeof''('''int''') * '''CHAR_BIT''' - 1))) max = x - ((x - y) & ((x - y) >> (''sizeof''('''int''') * '''CHAR_BIT''' - 1)))</code>===Кодирование информации===<code> <font color = green>// функция для шифровки текста с помощью XOR</font>
'''function''' encode(secret: '''string''', key: '''string'''): '''byte[]'''
btxt = secret.''getBytes''
'''return''' result
<font color = green>// метод функция для расшифровки текста</font>
'''function''' decode(secret: '''byte[]''', key: '''string'''): '''string'''
bkey = key.''getBytes''
'''return''' result ''as'' '''string'''
</code>
*'''''===[[Алгоритм Флойда#Оптимизация с помощью битовых масок | Алгоритм Флойда]]'''''*:Оптимизация с помощью битовых масок.===*'''''===[[Дерево Фенвика]]'''''===
==См. также==
276
правок

Навигация