Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

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

В С# имеется возможность сдвигать двоичные разряды, составляющие целое значение, влево или вправо на заданную величину. Ниже приведена общая форма для этих операторов:

<значение> << <число битов>

<значение> >> <число битов>

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

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

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

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

byte n = 6, result;

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

result = (byte)(n << 1);

Console.WriteLine("{0} * 2 = {1}", n, result);

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

result = (byte)(n << 2);

Console.WriteLine("{0} * 4 = {1}", n, result);

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

result = (byte)(n >> 1);

Console.WriteLine("{0} / 2 = {1}", n, result);

Console.WriteLine("Для продолжения нажмите любую клавишу . . . ");

Console.ReadKey();

}

}

}

/* Выведет:

* 6 * 2 = 12

* 6 * 4 = 24

* 6 / 2 = 3

* Для продолжение нажмите любую клавишу . . .

*/

3.5.8. Применение операторов: тернарный оператор Применение операторов: тернарный оператор

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

<выражение1> ? <выражение2> : <выражение3>;

Здесь выражение1 должно относиться к типу bool а выражение2 и выражениеЗ — к одному и тому же типу. Обратим внимание на применение двоеточия и его местоположение в операторе «?».Значение выражения «?» определяется следующим образом. Сначала вычисляется выражение1. Если оно истинно, то вычисляется выражение2, а полученный результат определяет значение всего выражения «?» в целом. Если же выражение1 оказывается ложным, то вычисляется выражениеЗ, и его значение становится общим для всего выражения «?»:

int b, c;

c = -4;

b = c >= 0 ? c : c*c; // b = 16

Присваивать переменной результат выполнения оператора «?» совсем не обязательно. Например, значение, которое даёт оператор «?», можно использовать в качестве аргумента при вызове метода. А если все выражения в операторе ? относятся к типу bool, то такой оператор может заменить собой условное выражение в цикле или операторе if. Давайте рассмотрим пример использования тернарного оператора:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace LC_Console

{

class Program

{

static void Main(string[] args)

{

int result;

// Реализуем функцию модуля числа

for (int i = 5; i >= -5; i--)

{

result = i >= 0 ? i : -i;

Console.Write("{0}\t", result);

}

Console.WriteLine("\n\n");

// Выбор четных чисел

for (int i = 0; i < 10; i++)

{

if (i % 2 == 0 ? true : false)

Console.Write("{0}\t",i);

}

Console.WriteLine("Для продолжения нажмите любую клавишу . . . ");

Console.ReadKey();

}

}

}

/* Выведет:

* 5 4 3 2 1 0 1 2 3 4 5

*

*

* 0 2 4 5 8

* Для продолжение нажмите любую клавишу . . .

*/