Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
программирование лекции.doc
Скачиваний:
32
Добавлен:
03.12.2018
Размер:
4.85 Mб
Скачать

5.1.1.2 Операции отношения, сдвига с#

Все заявленные в заголовке подраздела операции в порядке убывания приоритета представлены в таблице 5.2.

Таблица 5.2 Операции отношения, сдвига С#

Знак операции

Название

<<

>>

Сдвиг влево

Сдвиг вправо

<

>

<=

>=

Меньше

Больше

Меньше или равно

Больше или равно

= =

! =

Равно

Не равно

Сдвиговые операции. Эта группа операций, имеющая наивысший приоритет из представленных в этой таблице, относится к поразрядным специальным бинарным операциям, которые применимы к целочисленным операндам типов: Int, UInt, ULong, Long. Они сдвигают двоичное представление первого операнда влево или вправо на количество двоичных разрядов, заданное вторым операндом. Фактически учитывается только 5 младших битов второго операнда, если первый имеет тип int или uint, и 6 битов, если первый операнд имеет тип long или ulong.

I << J – означает сдвиг цифр содержимого I на J битов влево, освобождающиеся младшие разряды заполняются нулями;

I >> J – означает сдвиг цифр содержимого I на J битов вправо, освобождающиеся старшие разряды заполняются нулями, где I и J – выражения любого целого типа. Так происходит, если первый операнд беззнакового типа. При сдвиге вправо значения со знаковым разрядом знаковый бит сохраняется. В этот бит записывается 0 для положительных чисел и 1 – для отрицательных. Таким образом, сдвиговые операции не являются циклическими и потерянные биты невозможно восстановить.

Следующие шесть операций – это операции отношения. Операции отношения предназначены для сравнения двух величин. Естественно, что величины должны быть сравнимых типов. Результат сравнения имеет логический тип. Эти операции часто используются вместе с логическими операциями.

В полном своем составе операции отношения применимы только к тем типам, которые поддерживают отношения упорядоченных значений. Таковыми являются все числовые типы. Операции сравнения на равенство и неравенство име­ют меньший приоритет, чем остальные операции сравнения.

Логические же значения true и false C# не рассматривает как упорядоченные, а, следовательно, к ним применимы только две операции отношения: == (равно) и != (не равно). Указанные две операции в C# можно применять вообще к любым объектам.

5.1.1.3 Поразрядные и логические операции с#

Все заявленные в заголовке подраздела операции в порядке убывания приоритета представлены в таблице 5.3.

Таблица 5.3Поразрядные и логические операции С#

Знак операции

Название

&

^

|

~

Поразрядная конъюнкция (И)

Поразрядное исключающее ИЛИ

Поразрядная дизъюнкция (ИЛИ)

Поразрядное отрицание

&&

| |

Логическое И

Логическое ИЛИ

Поразрядные операции. Операции &, |, ^, ~ используются в C# для реализации над целыми числами типов: Int, UInt, ULong, Long базовых логических операций И, ИЛИ, ИСКЛЮЧАЮЩЕЕ ИЛИ, НЕ. Характеристика основных логических операций приведена ниже в таблице 5.4. Тип результата указанных операций при этом определяется типом операнда, имеющего наименьший размер.

Таблица 5.4  Таблица истинности логических операций

X

Y

X & Y

X | Y

~ (X)

X ^ Y

True

True

True

True

False

False

True

False

False

True

False

True

False

True

False

True

True

True

False

False

False

False

True

False

В применении к целым числам эти операции имеют следующий смысл:

  • ~ – инверсия всех битов целого числа;

  • & – побитовая логическая операция И двух целых чисел;

  • | – побитовая логическая операция ИЛИ двух целых чисел;

  • ^ – побитовая логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ (сложение по модулю 2) двух целых чисел.

В отличие от поразрядных логических операций условные логические операции: «&&», «||» выполняются в C# по специальной сокращенной форме, позволяющей получать более эффективный код, уменьшая время выполнения программы.

Сокращенная форма выполнения логических операций «&&», «||» базируется на том факте, что в некоторых ситуациях значение результата операции определяется значением только первого операнда, а, следовательно, отсутствует необходимость в вычислении значения второго операнда, которое само по себе может быть достаточно сложным.

Например, если первый операнд операции «&&» имеет значение false, то каково бы не было значение второго операнда, значение результата операции будет false (табл. 5.4). Например: значение выражения:

(y<=1) && (y>=0) при y>1 – всегда будет равно false.

В свою очередь, при выполнении операции «||», если значение первого операнда – true, то при любом значении второго операнда, значение результата операции будет true (табл. 5.4), поэтому вычисление значения второго операнда оказывается излишним и его можно опустить. Например: значение выражения (y>=0) || (y>=abs(x)) при y>=0 будет равно true.