Битовые операции в C# (Часть 4)

Исключающее ИЛИ

В предыдущих статьях, я рассказал про использование битовых сдвигов, битовых операций «И»  и «ИЛИ». В этой статье я расскажу об использовании операции побитового «ИСКЛЮЧАЮЩЕГО ИЛИ». Эта битовая операция является весьма интересной по той причине, что она является симметричной. Это значит, что если наложить на определенное число какую-то битовую маску, а потом на результат это операции снова наложить эту же маску, то мы снова получим исходное число. И эта особенность может пригодиться, например в шифрующих программах, которые используют симметричные алгоритмы шифрования.

Ну так давайте разберемся как же работает эта операция. А принцип работу у нее такой же как и операций «И» и «ИЛИ», т.е. перебираются и анализируются соответствующие биты обоих операндов (нулевой бит первого числа, анализируется в паре с нулевым битом второго числа, первый бит с первым, второй со вторым и т.д. до последних битов чисел) и на основании анализа формируется соответствующие биты результирующего числа. Но «ИСКЛЮЧАЮЩЕЕ ИЛИ» отличается от операций «И» и «ИЛИ» тем, что соответствующий бит результирующего числа будет равен единице, тогда и только тогда, когда лишь бит одного из анализируемых чисел равен единице! Во все остальных случаях, результирующий будет равен нулю. В C# операция «ИСКЛЮЧАЮЩЕГО ИЛИ» обозначается как «^». И таким образом, 01110111 ^ 01010110 даст в результате 00100001.

А приведенный ниже пример кода, покажет симметричность «ИСКЛЮЧАЮЩЕГО ИЛИ»:


//Исходное число
int firstArg = 125;

//Битовая маска
int mask = 0x10;

//Вывод в консоль исходного числа
Console.WriteLine("Исходное значеине: " + firstArg);

//Наложение битовой маски на исходно число
firstArg = firstArg ^ mask;

//Вывод в консоль результата
Console.WriteLine("Результат первого выполнения операции: " + firstArg);

//Наложение битовой маски уже на результат (повторение операции)
firstArg = firstArg ^ mask;

//И снова вывод в консоль
Console.WriteLine("Результат повторного выполнения операции: " + firstArg);

Если вставить этот код в метод «Main» нового проекта и собрать его, то после запуска приложения, Вы увидите следующее:

Результат выполнения программы (исключающее или)

Результат выполнения программы

А теперь о том, как это можно использовать на практике… Мы можем побайтово считать какой-то файл с диска, и на каждый байт наложить некую битовую маску, тем самым изменив до неузнаваемости содержание этого файла (по сути, зашифровав его), и снова записать этот файл (уже измененный) на диск.  А потом, когда мы захотим воспользоваться «зашифрованным» файлом, мы снова повторим эту же операцию (только нужно запомнить ту самую битовую маску) и файл опять примет исходный вид, и им можно будет воспользоваться!

 

Добавить комментарий