Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ответы.docx
Скачиваний:
336
Добавлен:
22.03.2016
Размер:
1.03 Mб
Скачать

23. Побитовые операции сдвига

Операции сдвига - << и >> - бинарные операции. Операнды целого типа. Результат также целого типа. Формат записи:

< Операнд 1 > << < Операнд 2 > - сдвиг влево

< Операнд 1 > >> < Операнд 2 > - сдвиг вправо

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

Значение второго операнда должно быть больше или равно 0 и меньше количества двоичных разрядов первого операнда, иначе результат выполнения операций не гарантирован (зависит от реализации, но обычно равен 0).

Примеры:

unsigned a = 20, n = 3, r;

r = a << n;

cout << r << endl; // На экран выведено 160

r = a >> n;

cout << r << endl; // На экран выведено 2

Иллюстрация:

Номер разряда: 31 30 … 8 7 6 5 4 3 2 1 0

Значение a: 0 0 … 0 0 0 0 1 0 1 0 0 = 20

Операция: a << n

Значение r: 0 0 … 0 1 0 1 0 0 0 0 0 = 160

Операция: a >> n

Значение r: 0 0 … 0 0 0 0 0 0 0 1 0 = 2

Операция сдвига влево осуществляет перемещение битов левого операнда a в сторону больших разрядов на количество разрядов, равное значению правого операнда n. Это эквивалентно умножению значения a на 2 в степени n (20 * 8 = 160).

Операция сдвига вправо осуществляет перемещение битов левого операнда a в сторону меньших разрядов на количество разрядов, равное значению правого операнда n. Это эквивалентно делению значения a на 2 в степени n (целочисленное деление 20 / 8 = 2).

Используя операцию сдвига влево очень просто получить любую целую степень двойки в диапазоне степеней равной количеству двоичных разрядов правого операнда без 1. Например, так:

1U << 20 - равно 2 в степени 20, то есть 1048576

При сдвиге влево (в сторону старших разрядов), освобождающиеся младшие разряды замещаются 0 (нулями). При сдвиге вправо возможны две ситуации: если первый операнд беззнаковый (unsigned), то освобождающиеся старшие разряды замещаются 0; если же первый операнд знаковый, то освобождающиеся старшие разряды замещаются либо знаковым разрядом, либо 0 (нет гарантии - зависит от реализации).

24. Побитовые логические операции

К этой группе операций относятся:

• ~ - побитовое отрицание (побитовое НЕ) - унарная операция;

• & - побитовая конъюнкция (побитовое И) - бинарная операция;

• | - побитовая дизъюнкция (побитовое ИЛИ) - бинарная операция;

• ^ - побитовое исключающее ИЛИ - бинарная операция.

Операндами этих операций целочисленных типов данных. Результат также целочисленный.

Операция побитовое отрицание (~) осуществляет инвертирование всех байтов двоичного представления своего операнда. Например:

int a = 14, r;

r = ~a;

cout << r << endl; // На экран выведено -15

Иллюстрация:

Номер разряда: 31 30 … 8 7 6 5 4 3 2 1 0

Значение a: 0 0 … 0 0 0 0 0 1 1 1 0 = 14

Значение r = ~a: 1 1 … 1 1 1 1 1 0 0 0 1 = -15

Остальные операции выполняют соответствующую логическую операцию над каждой парой соответствующих разрядов первого и второго операндов, интерпретируя значения двоичных разрядов как логические значения (1 - true; 0 - false). Например:

int a = 14, b = 7, r;

r = a & b;

cout << r << endl; // На экран выведено 6

r = a | b;

cout << r << endl; // На экран выведено 15

r = a ^ b;

cout << r << endl; // На экран выведено 9

Иллюстрация:

Номер разряда: 31 30 … 8 7 6 5 4 3 2 1 0

Значение a: 0 0 … 0 0 0 0 0 1 1 1 0 = 14

Значение b: 0 0 … 0 0 0 0 0 0 1 1 1 = 7

Операция: a & b

Значение r: 0 0 … 0 0 0 0 0 0 1 1 0 = 6

Операция: a | b

Значение r: 0 0 … 0 0 0 0 0 1 1 1 1 = 15

Операция: a ^ b

Значение r: 0 0 … 0 0 0 0 0 1 0 0 1 = 9

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