Изменения

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

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

288 байт добавлено, 20:38, 6 марта 2016
Применение для решения задач
==Применение для решения задач==
*'''''Проверка на то, является ли число степенью двойки:'''''<br/>*:Если выражение <tex>(x\ \&\ (x - 1))</tex> равно нулю, то число <tex>x</tex> является степенью двойки <tex>(x \not= 0)</tex>.*'''''Проверка на то, что в битовой записи числа нет двух единиц, идущих подряд:'''''<br/>*:Если выражение <tex>(x\ \&\ (x \ll 1))</tex> равно нулю, то в битовой записи числа <tex>x</tex> нет двух единиц, идущих подряд.*'''''Номер младшего единичного бита:'''''<br/>*:Число, полученное в результате операции <tex>x\ \&\ (\sim x + 1)</tex> будет равно номеру младшего единичного бита в числе <tex>x</tex>.*'''''Работа с битовыми масками:'''''<br/>*:Храним подмножества множества из <tex>32, 64</tex> или <tex>128</tex> фиксированных элементов. Значение каждого бита позволяет понять, включен элемент в множество или нет. Тогда легко сделать следующее: найти дополнение <tex>(\sim)</tex>, пересечение <tex>(\&)</tex>, объединение <tex>(\mid)</tex> множеств, установить бит по номеру <tex>(\mid 1 \ll x)</tex>, снять бит по номеру <tex>(\& \sim(1 \ll x))</tex>.*'''''Определение знака числа:'''''<code>sign = (v != 0) | -(int)((unsigned int)((int)v) >> (sizeof(int) * CHAR_BIT - 1));// Or, for more speed but less portability:sign = (v != 0) | (v >> (sizeof(int) * CHAR_BIT - 1)); // -1, 0, or +1// Or, for portability, brevity, and (perhaps) speed:sign = (v > 0) - (v <br0); // -1, 0, or +1</code>*'''''[[Алгоритм Флойда]]'''''*:<br/>Оптимизация с помощью битовых масок. Время работы <tex>O\Big(\dfrac{n^3}{k}\Big)</tex>.
*'''''[[Дерево Фенвика]]'''''
276
правок

Навигация