
В ходе работы программы может возникнуть необходимость инвертировать отдельные биты в целом числе. Например, в одном из проектов требуется инвертировать биты 7, 5 и 2 каждые N миллисекунд.
Для решения этой задачи можно использовать операцию побитового исключающего ИЛИ (XOR). Операция XOR имеет следующий вид:
result = a ^ b
где result - результат операции, a и b - операнды.
Если соответствующие биты a и b одинаковы, то результат будет равен 0. Если биты различны, то результат будет равен 1.
Таким образом, чтобы инвертировать бит в целом числе, необходимо выполнить операцию XOR с числом, в котором этот бит установлен в 1. Например, чтобы инвертировать 7-й бит, нужно использовать число (1 << 7).
Однако в приведённом примере инвертируется только старший бит, 5 и 2 остаются в состоянии 1. Проблема заключается в том, что операция XOR выполняется не по отдельности с каждым битом, а со всем числом.
Чтобы инвертировать отдельные биты, необходимо использовать побитовую маску. Побитовая маска - это целое число, в котором установлены те биты, которые нужно инвертировать.
В приведённом примере побитовая маска будет иметь следующий вид:
mask = (1 << 7) | (1 << 5) | (1 << 2)
Теперь можно выполнить операцию XOR с числом flags и побитовой маской:
flags ^= mask
В результате будут инвертированы только биты 7, 5 и 2.
Подведём итог: чтобы инвертировать отдельные биты в целом числе, нужно выполнить следующие шаги: