double arrow

Операции сдвига


Операции сдвига << и >> группируют слева направо. Обе выполняют одно обычное арифметическое преобразование над своими операндами, каждый из которых должен быть целым. В этом случае правый операнд преобразуется к типу int; тип результата совпадает с типом левого операнда. Результат не определен, если правый операнд отрицателен или больше или равен длине объекта в битах.

Форма записи:

выражение << выражение выражение >> выражение

Значением Е1 << Е2 является Е1 (рассматриваемое как битовое представление), сдвинутое влево на Е2 битов; освободившиеся биты заполняются нулями. Значением Е1 >> Е2 является Е1 , сдвинутое вправо на Е2 битовых позиций. Гарантируется, что сдвиг вправо является логическим (заполнение нулями), если Е1 является unsigned; в противном случае он может быть арифметическим (заполнение копией знакового бита).

Отметим, что сдвиг влево соответствует умножению первого операнда на степень числа 2, равную второму операнду, а сдвиг вправо соответствует делению первого операнда на 2 в степени, равной второму операнду.

Примеры:

int i=0x1234, j, k ; k = i<<8 ; /* i = 0x34 */ i 0001 0010 0011 1000

i<<8 0011 1000 0000 0000 -à0x34 (логический сдвиг)

i>>8 0000 0000 0001 0010 -à0x0012

-i>>8 1111 1111 0001 0010 -à0xff12 (арифметический сдвиг)

Операция побитовое И

Форма записи:

выражение & выражение

Операция & ассоциативна, и выражения, содержащие &, могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция И операндов. Операция применяется только к целым операндам.

Пример.

int i=0x45FF, /* i= 0100 0101 1111 1111 */ j=0x00FF; j= 0000 0000 1111 1111 */ char r; r = i&j; /* r=0x00FF = 0000 0000 1111 1111 */

Операция побитовое исключающее ИЛИ

Форма записи:

выражение ^ выражение

Операция ^ ассоциативна, и выражения, содержащие ^, могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция исключающее ИЛИ операндов. Операция применяется только к целым операндам.

A B ^ ( исключающее ИЛИ)

Пример.

int i=0x45FF, /* i= 0100 0101 1111 1111 */ j=0x00FF; j= 0000 0000 1111 1111 */ char r; r = i^j; /* r=0x4500 = 0100 0101 0000 0000 */

Операция побитовое включающее ИЛИ

Форма записи:

выражение | выражение

Операция | ассоциативна, и выражения, содержащие |, могут реорганизовываться. Выполняются обычные арифметические преобразования; результатом является побитовая функция включающее ИЛИ операндов. Операция применяется только к целым операндам.

Пример.

int i=0x45FF, /* i= 0100 0101 1111 1111 */ j=0x00FF; j= 0000 0000 1111 1111 */ char r; r = i|j; /* r=0x45FF = 0100 0101 1111 1111 */

Сейчас читают про: