Kniga-Online.club
» » » » Герберт Шилдт - C# 4.0: полное руководство

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

Читать бесплатно Герберт Шилдт - C# 4.0: полное руководство. Жанр: Программирование издательство -, год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

    }

    Console.WriteLine() ;

    val = 128;

    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; // сдвиг вправо

    }

  }

}

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

0 0 0 0 0 0 0 1

0 0 0 0 0 0 1 0

0 0 0 0 0 1 0 0

0 0 0 0 1 0 0 0

0 0 0 1 0 0 0 0

0 0 1 0 0 0 0 0

0 1 0 0 0 0 0 0

1 0 0 0 0 0 0 0

1 0 0 0 0 0 0 0

0 1 0 0 0 0 0 0

0 0 1 0 0 0 0 0

0 0 0 1 0 0 0 0

0 0 0 0 1 0 0 0

0 0 0 0 0 1 0 0

0 0 0 0 0 0 1 0

0 0 0 0 0 0 0 1

Двоичные разряды соответствуют форме представления чисел в степени 2, и поэтому операторы сдвига могут быть использованы для умножения или деления целых значений на 2. Так, при сдвиге вправо целое значение удваивается, а при сдвиге влево — уменьшается наполовину. Разумеется, все это справедливо лишь в том случае, если крайние разряды не теряются при сдвиге в ту или иную сторону. Ниже приведен соответствующий пример.

// Применить операторы сдвига для умножения и деления на 2.

using System;

class MultDiv {

  static void Main() {

    int n;

    n = 10;

    Console.WriteLine("Значение переменной n: " + n) ;

    // Умножить на 2.

    n = n << 1;

    Console.WriteLine("Значение переменной n: после " +

                "операции n = n * 2: " + n) ;

    // Умножить на 4.

    n = n << 2;

    Console.WriteLine("Значение переменной n: после " +

                "операции n = n * 4: " + n) ;

    // Разделить на 2.

    n = n >> 1;

    Console.WriteLine("Значение переменной n: после " +

                "операции n = n / 2: " + n) ;

    // Разделить на 4.

    n = n >> 2;

    Console.WriteLine("Значение переменной n: после " +

                "операции n = n / 4: " + n) ;

    Console.WriteLine();

    // Установить переменную n в исходное состояние,

    n = 10;

    Console.WriteLine("Значение переменной n: " + n);

    // Умножить на 2 тридцать раз.

    n = n << 30; // данные теряются

    Console.WriteLine("Значение переменной n после " +

                "сдвига на 30 позиций влево: " + n);

  }

}

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

Значение переменной n: 10

Значение переменной n: после  операции n = n * 2: 20 

Значение переменной n: после  операции n = n * 4: 80 

Значение переменной n: после  операции n = n / 2: 40 

Значение переменной n: после  операции n = n / 4: 10 

Значение переменной n: 10

Значение переменной n после сдвига на 30 позиций влево: -2147483648

Обратите внимание на последнюю строку приведенного выше результата. Когда целое значение 10 сдвигается влево тридцать раз подряд, информация теряется, поскольку двоичные разряды сдвигаются за пределы представления чисел для типа int. В данном случае получается совершенно ''непригодное" значение, которое оказывается к тому же отрицательным, поскольку в результате сдвига в старшем разряде, используемом в качестве знакового, оказывается 1, а следовательно, данное числовое значение должно интерпретироваться как отрицательное. Этот пример наглядно показывает, что применять операторы сдвига для умножения или деления на 2 следует очень аккуратно. (Подробнее о типах данных со знаком и без знака см. в главе 3.)

Поразрядные составные операторы присваивания

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

х = х ^ 127;

х ^= 127;

Оператор ?

Оператор ? относится к числу самых примечательных в С#. Он представляет собой условный оператор и часто используется вместо определенных видов конструкций if-then-else. Оператор ? иногда еще называют тернарным, поскольку для него требуются три операнда. Ниже приведена общая форма этого оператора.

Выражение1 ? Выражение2 : Выражение3;

Здесь Выражение1 должно относиться к типу bool, а Выражение2 и Выражение3 — к одному и тому же типу. Обратите внимание на применение двоеточия и его местоположение в операторе ?.

Значение выражения ? определяется следующим образом. Сначала вычисляется Выражение1. Если оно истинно, то вычисляется Выражение2, а полученный результат определяет значение всего выражения ? в целом. Если же Выражение1 оказывается ложным, то вычисляется Выражение3, и его значение становится общим для всего выражения ?. Рассмотрим следующий пример, в котором переменной absval присваивается значение переменной val.

absval = val < 0 ? -val : val; // получить абсолютное значение переменной val

В данном примере переменной absval присваивается значение переменной val, если оно больше или равно нулю. Если же значение переменной val отрицательно, то переменной absval присваивается результат отрицания этого значения, что в итоге дает положительное значение.

Ниже приведен еще один пример применения оператора ?. В данной программе одно число делится на другое, но при этом исключается деление на нуль.

// Исключить деление на нуль, используя оператор?.

using System;

class NoZeroDiv {

  static void Main() {

    int result;

    for(int i = -5; i < 6; i++) {

      result = i != 0 ? 100 / i : 0;

      if (i != 0)

        Console.WriteLine("100 / " + i + " равно " + result);

    }

  }

}

Выполнение этой программы дает следующий результат.

100 / -5 равно -20

100 / -4 равно -25

100 / -3 равно -33

100 / -2 равно -50

100 / -1 равно -100

100 / 1 равно 100

100 / 2 равно 50

100 / 3 равно 33

100 / 4 равно 25

100 / 5 равно 20

Обратите особое внимание на следующую строку из приведенной выше программы.

result = i != 0 ? 100 / i : 0;

В этой строке переменной result присваивается результат деления числа 100 на значение переменной i. Но это деление осуществляется лишь в том случае, если значение переменной i не равно нулю. Когда же оно равно нулю, переменной result присваивается значение, обнуляющее результат.

Перейти на страницу:

Герберт Шилдт читать все книги автора по порядку

Герберт Шилдт - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


C# 4.0: полное руководство отзывы

Отзывы читателей о книге C# 4.0: полное руководство, автор: Герберт Шилдт. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администратор kniga-online.


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*