Битовые операции в 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» нового проекта и собрать его, то после запуска приложения, Вы увидите следующее:
А теперь о том, как это можно использовать на практике… Мы можем побайтово считать какой-то файл с диска, и на каждый байт наложить некую битовую маску, тем самым изменив до неузнаваемости содержание этого файла (по сути, зашифровав его), и снова записать этот файл (уже измененный) на диск. А потом, когда мы захотим воспользоваться «зашифрованным» файлом, мы снова повторим эту же операцию (только нужно запомнить ту самую битовую маску) и файл опять примет исходный вид, и им можно будет воспользоваться!
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.