Присваивание с побитовой операцией исключающее ИЛИ "^="

Составной побитовый оператор XOR ^= часто используется с переменной и константой для переключения (инвертирования) определенных битов в переменной.

Обзор побитового оператора XOR:

0 0 1 1   операнд1
0 1 0 1   операнд2
--------
0 1 1 0   (операнд1 ^= операнд2) - возвращаемый результат

Синтаксис

x ^= y; // эквивалентно x = x ^ y;

Параметры

x: переменная. Допустимые типы данных: char, int, long
y: переменная или постоянная. Разрешенные типы данных: char, int, long

Пример кода

Биты, к которым применили операцию с 0, остаются без изменений. Таким образом, если myByte является байтовой переменной,

myByte ^ B00000000 = myByte;

Биты, к которым применили операцию с 1, переключаются так:

myByte ^ B11111111 = ~myByte;

Примечания и предупреждения

Поскольку мы имеем дело с битами в побитовом операторе - удобно использовать двоичный формат с константами. Числа по-прежнему имеют одинаковое значение в других представлениях, их просто не так просто понять. Кроме того, B00000000 показан для ясности, но ноль в любом числовом формате равен нулю.

Следовательно, чтобы переключать биты 0 и 1 переменной, оставляя остальную часть переменной без изменений, используйте составной битовый оператор XOR (^=) с константой B00000011

1 0 1 0 1 0 1 0  переменная
0 0 0 0 0 0 1 1 маска
---------------
1 0 1 0 1 0 0 1

      |      |
      |      |___ 
биты переключились
      |__________ биты без изменений
Здесь то же самое представление с битами переменных, замененными символом x. ~ x представляет собой дополнение к x.

x x x x x x x x   переменная
0 0 0 0 0 0 1 1   маска
---------------
х х х х х х ~ х ~ х

      |      |
      |      |___ 
биты переключились
      |__________ биты без изменений

Пример кода:

myByte = B10101010;
myByte ^= B00000011 == B10101001;