Набор Алгоритмов

Статья посвящена побитовому обмену значений переменных через "побитовое исключающее ИЛИ" (или побитовый XOR). Статья рассказывает, как применяется "логическое исключающее ИЛИ", "побитовое исключающее ИЛИ", как с помощью "побитового исключающего ИЛИ" обменять биты значений переменных. Т.е. обмен переменных через "побитовое исключающее ИЛИ" (Побитовый XOR).

Алгоритмы - Обмен битов значений переменных с помощью Побитового исключающего ИЛИ (Побитового XOR)

Сначала рассмотрим работу исключающего ИЛИ на примере однобитных значений.

Пусть у нас есть бит a1 и b1. Логическое исключающее ИЛИ истинно для тех случаев, когда один бит равен нуль, другой единица. Посмотрим на таблицу истинности "логического исключающего ИЛИ":

a1 b1 Результат
0 0 0
0 1 1
1 0 1
1 1 0

Таблица 1. Логическое исключающее ИЛИ.

"Побитовое исключающее ИЛИ" действует, как "Логической исключающее ИЛИ" только соответственно для бит в числе с одинаковыми позициями. Рассмотрим Побитовое исключающее ИЛИ для двухбитных a и b:

a b Результат
Бит 0 Бит 1 Бит 0 Бит 1
0 1 1 1 1 0

Таблица 2. Побитового исключающее ИЛИ.

Пусть символ '^' символ побитового исключающего ИЛИ, тогда обмен переменными a и b происходит так:

a=5, b=6;
a = a ^ b;
b = a ^ b;
a = a ^ b;

Объясним пример:

Сначала перенные имеют следующее значение a=5, b=6. На втором шаге перенная a имеет значение a = 5 XOR b. На третьем шаге b = 5 XOR b XOR b, обратите внимание, что b XOR b равен нулю - т.к. все биты совпадают, потом получается 5 XOR 0, что равно 5 - т.к. каждая еденица пятёрки сохраняется, а нуль остаётся нулём, т.е. в b уже храниться число 5, а a = 5 XOR 6. На третьем шаге в "a" записывается 5 XOR 6 XOR 5, что по аналогии равно 6.

Эти два значения ивляются целыми значениями, для понимания Вы должны знать, как представляются целые числа в битовом представлении, причём, для каждого типа обмениваемого значения.

Пример программы для обмена целых чисел на языке C++:

#include <iostream>
#include <string>

int main()
{
    // Инициализация переменных.
    int a = 5, b = 6;

    // Вывод состояния переменных до обмена
    std::cout << "Variables before exchange:\na = " + std::to_string(a) + "\nb = " + std::to_string(b) + "\n";

    // Обмен значений переменных
    a ^= b;
    b ^= a;
    a ^= b;

    // Вывод состояния переменных после обмена
    std::cout << "Variables after exchange:\na = " + std::to_string(a) + "\nb = " + std::to_string(b) + "\n";
}

Пример 1. Программа на С++ для демонстрации обмена переменных.

Заключение

Мы рассмотрели обмен переменными с использованием Побитового исключающего ИЛИ. Если Вы знаете логику побитового исключающего ИЛИ для других типов данных, отличных от побитовых, то можете приспособить обмен и для этого типа, имеется ввиду типы значения класса и структуры, для них можно переопределять оператор (операцию). Но всегда используйте его, как обмена битами.