Операции сдвига << и >> группируют слева направо. Обе выполняют одно обычное арифметическое преобразование над своими операндами, каждый из которых должен быть целым. В этом случае правый операнд преобразуется к типу 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 1000i<<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 */