Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp Language Specification.doc
Скачиваний:
13
Добавлен:
26.09.2019
Размер:
4.75 Mб
Скачать

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

Операторы << и >> используются для выполнения операций побитового сдвига.

выражение_сдвига: аддитивное_выражение выражение_сдвига << аддитивное_выражение выражение_сдвига сдвиг_вправо аддитивное_выражение

Если операнд выражения-сдвига имеет динамический тип во время компиляции, то он динамически связан (§7.2.2). В этом случае тип времени компиляции выражения динамический, а разрешение, приведенное ниже, будет иметь место во время выполнения при использовании типа времени выполнения тех операндов, которые имеют динамический тип во время компиляции.

Для операции вида x << число или x >> число, чтобы выбрать конкретную реализацию оператора, применяется разрешение перегрузки бинарного оператора (§7.3.4). Операнды преобразуются в типы параметров выбранного оператора, а тип результата является типом возвращаемого значения этого оператора.

При объявлении перегруженного оператора сдвига тип первого операнда всегда должен быть классом или структурой, в которой находится объявление оператора, а второй операнд должен иметь тип int.

Ниже перечислены стандартные операторы сдвига.

  • Сдвиг влево:

int operator <<(int x, int count); uint operator <<(uint x, int count); long operator <<(long x, int count); ulong operator <<(ulong x, int count);

Оператор << выполняет сдвиг значения x влево на определенное число битов и вычисляется, как указано ниже.

Старшие биты вне диапазона типа результирующего значения x отбрасываются, оставшиеся биты сдвигаются влево, а пустые позиции младших битов заполняются нулями.

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

int operator >>(int x, int count); uint operator >>(uint x, int count); long operator >>(long x, int count); ulong operator >>(ulong x, int count);

Оператор >> выполняет сдвиг значения x вправо на определенное число битов и вычисляется, как указано ниже.

Если x имеет тип int или long, то младшие биты x отбрасываются, оставшиеся биты сдвигаются вправо, а пустые позиции старших битов заполняются нулями, если x является неотрицательным числом, и заполняются единицами, если x является отрицательным числом.

Если x имеет тип uint или ulong, младшие биты x отбрасываются, оставшиеся биты сдвигаются вправо, а пустые позиции старших битов заполняются нулями.

Для стандартных операторов число сдвигаемых битов вычисляется следующим образом.

  • Если x имеет тип int или uint, размер сдвига задается пятью младшими битами числа. Другими словами, величина сдвига вычисляется от значения число & 0x1F.

  • Если x имеет тип long или ulong, величина сдвига задается шестью младшими битами числа. Другими словами, величина сдвига вычисляется от значения число & 0x3F.

Если результирующая величина сдвига равна нулю, то операторы сдвига просто возвращают значение x.

Операции сдвига никогда не вызывают переполнения и дают одинаковые результаты в контекстах checked и unchecked.

Если левый операнд оператора >> имеет целый тип со знаком, оператор выполняет арифметический сдвиг вправо, когда значение самого важного бита (бита знака) операнда распространяется на пустые позиции старших битов. Если левый операнд оператора >> имеет целый тип без знака, оператор выполняет логический сдвиг вправо, когда пустые позиции старших битов всегда заполняются нулями. Для выполнения обратной операции выведенной из типа операнда можно использовать явное приведение типов. Например, если x является переменной типа int, то операция unchecked((int)((uint)x >> y)) выполняет логический сдвиг x вправо.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]