Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c-operators.doc
Скачиваний:
7
Добавлен:
08.11.2018
Размер:
198.14 Кб
Скачать
      1. Пример.

Пусть a=0х6DB7, тогда при выполнении операции b=a<< 6 происходит следующее:

a= 0110110110110111

теряются сдвигаются и заполняются нулями

Окончательно имеем

b= 0110 1101 1100 0000.

Сдвиг вправо несколько отличается от сдвига влево. Выходящие за разрядную сетку биты, как и ранее, теряются. Однако заполнение освобождающихся слева разрядов может происходить по разному в зависимости от реализации (компилятора) и стандартом языка жестко не определяется.

Гарантируется, что при сдвиге вправо беззнаковых операндов ( unsigned) освобождающиеся разряды заполняются нулями.

В случае знакового операнда результат сдвига может зависеть от значения крайнего левого (знакового) бита. Большинство компиляторов заполняют вакантные разряды содержимым знакового разряда (так называемое размножение знака).

Однако некоторые копиляторы могут всегда вносить нули в освобождающиеся разряды, не обращая внимания на знак.

Чтобы обеспечить переносимось программ, нужно избегать применения сдвига вправо для знаковых величин или вначале явно преобразовывать их в беззнаковые, и лишь затем выполнять сдвиг.

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

      1. Примеры.

1. Если a= 1111 0000 0101 1010 — беззнаковый операнд

(unsigned), то

\hspace15mm a>>6 = 0000 0011 1100 0001.

2. Если b = 1111 0000 0101 1010 — знаковый операнд

( signed), то

\hspace15mm b>>6 = 1111 1111 1100 0001 .

Задание.

1. Записать выражение, значение которого в двоичном представлении

содержит единицы в N младших разрядах и нули во всех остальных.

2. Записать выражение, значение которого в двоичном представлении содержит

единицы в разрядах с N по P (N<P) и нули во всех остальных.

3. Выделить из величины x типа unsigned int разряды с N по P как

самостоятельное число.

4. Какое выражение "вращает" величину x типа unsigned int на один

разряд вправо (все разряды кроме младщего сдвигаются вправо, а младший

перемещается в положение старшего).

Oперации присваивания и побитовые операции

Побитовые операции могут быть скомбинированы с операцией присваивания

для чего используются следующие символы операций:

&=^= =<<=>>=

Левый операнд, как обычно для операции присваивания, должен быть l-value,

и в данном случае — целого типа, а операнд в правой части должен быть битовым выражением

(т.е. выражением, результат которого можно рассматривать как

последовательность бит).

% a&\kern -5pt=b

Смысл этих операций прост, например,

%\beginverbatim

a&=b аналогично a = a&b .

%\endverbatim

%

      1. Примеры.

Пусть a=0х6DB7. Тогда в результате выполнения операций

a&=0x7F,a^=0x7F,a|=0x7F,a<<=5,

a>>=5

получим соответственно следующие значения a:

0x37,0x6DC8,0x6DFF,0xB6E0,0x36D.

Условная операция

Простые условные вычисления могут быть выполнены с помощью

единственной в Си операции с трeмя операндами (тернарной) вида

<выражение_1> ? <выражение_2> : <выражение_3>

Вначале вычисляется <выражение_1>. Если оно не равно нулю

(напомним, что в Си это воспринимается как "истина"), то подсчитывается

<выражение_2>, иначе <выражение_3>.

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