C# 4.0: полное руководство | страница 72




>R1 = X ^ Y;

>R2 = R1 ^ Y;


значение переменной R2 оказывается в итоге таким же, как и значение переменной X. Следовательно, в результате двух последовательно выполняемых поразрядных операций исключающее ИЛИ, в которых используется одно и то же значение, получается первоначальное значение. Этим свойством данной операции можно воспользоваться для написания простой программы шифрования, в которой некоторое целое значение служит в качестве ключа для кодирования и декодирования сообщения с помощью операции исключающее ИЛИ над символами этого сообщения. В первый раз операция исключающее ИЛИ выполняется для кодирования открытого текста в зашифрованный, а второй раз — для декодирования зашифрованного текста в открытый. Разумеется, такое шифрование не представляет никакой практической ценности, поскольку оно может быть легко разгадано. Тем не менее оно служит интересным примером для демонстрации результатов применения поразрядных операторов исключающее ИЛИ, как в приведенной ниже программе.

// Продемонстрировать применение поразрядного оператора исключающее ИЛИ.


>using System;

>class Encode {

>  static void Main() {

>    char ch1 = 'H';

>    char ch2 = 'i' ;

>    char ch3 = '!';

>    int key = 88;


>    Console.WriteLine("Исходное сообщение: " + ch1 + ch2 + ch3) ;


>    // Зашифровать сообщение,

>    ch1 = (char) (ch1 ^ key);

>    ch2 = (char) (ch2 ^ key);

>    ch3 = (char) (ch3 ^ key);


>    Console.WriteLine("Зашифрованное сообщение: " + ch1 + ch2 + ch3);


>    // Расшифровать сообщение.

>    ch1 = (char) (ch1 ^ key);   

>    ch2 = (char) (ch2 ^ key);

>    ch3 = (char) (ch3 ^ key);


>    Console.WriteLine("Расшифрованное сообщение: " + ch1 + ch2 + ch3);

>  }

>}


Ниже приведен результат выполнения этой программы.


>Исходное сообщение: Hi!

>Зашифрованное сообщение: Qly

>Расшифрованное сообщение: Hi!


Как видите, в результате выполнения двух последовательностей поразрядных операций исключающее ИЛИ получается расшифрованное сообщение. (Еще раз напомним, что такое шифрование не имеет никакой практической ценности, поскольку оно, в сущности, ненадежно.)

Поразрядный унарный оператор НЕ (или оператор дополнения до 1) изменяет на обратное состояние всех двоичных разрядов операнда. Так, если некоторое целое значение А имеет комбинацию двоичных разрядов 1001 0110, то в результате поразрядной операции ~А получается значение с комбинацией двоичных разрядов 0110 1001.

В следующем примере программы демонстрируется применение поразрядного оператора НЕ с выводом некоторого числа и его дополнения до 1 в двоичном коде.