Составной побитовый оператор 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;