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 в двоичном коде.