Герберт Шилдт - C# 4.0: полное руководство Страница 26

Тут можно читать бесплатно Герберт Шилдт - C# 4.0: полное руководство. Жанр: Компьютеры и Интернет / Программирование, год -. Так же Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте «WorldBooks (МирКниг)» или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Герберт Шилдт - C# 4.0: полное руководство

Герберт Шилдт - C# 4.0: полное руководство краткое содержание

Прочтите описание перед тем, как прочитать онлайн книгу «Герберт Шилдт - C# 4.0: полное руководство» бесплатно полную версию:
В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт - C# 4.0: полное руководство читать онлайн бесплатно

Герберт Шилдт - C# 4.0: полное руководство - читать книгу онлайн бесплатно, автор Герберт Шилдт

num после установки младшего разряда: 7

num: 7

num после установки младшего разряда: 7

num: 8

num после установки младшего разряда: 9

num: 9

num после установки младшего разряда: 9

num: 10

num после установки младшего разряда: 11

В приведенной выше программе выполняется поразрядная операция ИЛИ над каждым числовым значением переменной num и 1, поскольку 1 дает двоичное значение, в котором установлен младший разряд. В результате поразрядной операции ИЛИ над 1 и любым другим значением младший разряд последнего устанавливается, тогда как все остальные разряды остаются без изменения. Таким образом, результирующее числовое значение получается нечетным, если исходное значение было четным.

Поразрядный оператор исключающее ИЛИ устанавливает двоичный разряд операнда в том и только в том случае, если двоичные разряды сравниваемых операндов оказываются разными, как в приведенном ниже примере.

 0111 1111

 1011 1001

^_________

 1100 0110

У поразрядного оператора исключающее ИЛИ имеется одно интересное свойство, которое оказывается полезным в самых разных ситуациях. Так, если выполнить сначала поразрядную операцию исключающее ИЛИ одного значения X с другим значением Y, а затем такую же операцию над результатом предыдущей операции и значением Y, то вновь получится первоначальное значение X. Это означает, что в приведенном ниже фрагменте кода

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

// Продемонстрировать применение поразрядного унарного оператора НЕ.

using System;

class NotDemo {

  static void Main() {

  sbyte b = -34;

    for(int t=128; t > 0; t = t/2) {

      if((b & t) != 0) Console.Write("1 ");

      if((b & t) == 0) Console.Write("0 ");

    }

Console.WriteLine();

    // обратить все биты b = (sbyte) ~b;

    b = (sbyte) ~b;

    for(int t=128; t > 0; t = t/2) {

      if((b & t) != 0) Console.Write("1 ");

      if((b & t) == 0) Console.Write("0 ");

    }

  }

}

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

1 1 0 1 1 1 1 0

0 0 1 0 0 0 0 1

Операторы сдвига

В C# имеется возможность сдвигать двоичные разряды, составляющие целое значение, влево или вправо на заданную величину. Для этой цели в C# определены два приведенных ниже оператора сдвига двоичных разрядов.

<<  Сдвиг влево

>>  Сдвиг вправо

Ниже приведена общая форма для этих операторов:

значение « число_битов

значение » число_битов

где число_битов — это число двоичных разрядов, на которое сдвигается указанное значение.

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

При сдвиге влево и вправо крайние двоичные разряды теряются. Восстановить потерянные при сдвиге двоичные разряды нельзя, поскольку сдвиг в данном случае не является циклическим.

Ниже приведен пример программы, наглядно демонстрирующий действие сдвига влево и вправо. В данном примере сначала задается первоначальное целое значение, равное 1. Это означает, что младший разряд этого значения установлен. Затем это целое значение сдвигается восемь раз подряд влево. После каждого сдвига выводятся восемь младших двоичных разрядов данного значения. Далее процесс повторяется, но на этот раз 1 устанавливается на позиции восьмого разряда, а по существу, задается целое значение 128, которое затем сдвигается восемь раз подряд вправо.

// Продемонстрировать применение операторов сдвига.

using System;

class ShiftDemo {

  static void Main() {

    int val = 1;

    for(int i = 0; i < 8; i++) {

      for(int t=128; t > 0; t = t/2) {

        if((val & t) != 0) Console.Write("1 ");

        if((val & t) == 0) Console.Write("0 ");

      }

      Console.WriteLine();

      val = val << 1; // сдвиг влево

    }

Перейти на страницу:
Вы автор?
Жалоба
Все книги на сайте размещаются его пользователями. Приносим свои глубочайшие извинения, если Ваша книга была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.
Комментарии / Отзывы
    Ничего не найдено.