Логические операции
Логические операции предназначены для формирования признаков, используемых при управлении ходом выполнения программы. Эти операции рассматривают операнд с точки зрения его соответствия одному из двух значений: “Истина” или ”Ложь”. Типовые логические операции: НЕ, И, ИЛИ. Результат определяется таблицей истинности и представляет собой код, соответствующий “Истина” или ”Ложь”.
Особое место занимают битовые операции. Иногда их рассматривают как разновидность логических операций. В других случаях их выделяют в отдельную группу. С логическими операциями их сближает то, что битовые операции рассматривают данные как логические значения. Но, в отличие от логических операций, в качестве логического значения рассматривается каждый бит обрабатываемого кода.
Типовые битовые операции:
- инверсия битов (битовое НЕ),
- битовое умножение (битовое И),
- битовая неэквивалентность (битовое М2),
- битовое сложение (битовое ИЛИ).
Схемы выполнения битовых операций приведены на Рис.1.
Битовые операции используются для обработки отдельных бит кода. Такая необходимость часто возникает из-за того, что поля битов в составе единого кода имеют разное смысловое значение. Такой прием обычно используется в кодах, описывающих состояние аппаратных средств ЭВМ. Например, байт атрибутов, который определяет режим отображения символа на экране, имеет три разных по смыслу поля:
Биты с 0 по 3 – цвет символа
Биты с 4 по 6 – цвет фона
Бит 7 – признак мерцания символа
Обработка бит сводится к четырем основным задачам:
1.Проверка состояния заданного бита
2.Установка заданных бит в нулевое состояние
3.Установка заданных бит в единичное состояние
4.Инверсия заданных бит
В основе решения лежит выполнение битовой операции над исходным кодом и специально подготовленным кодом, который называется маской. Решение задач будем рассматривать на примере исходного пятиразрядного кода, приведенного на рисунке.
Проверка состояния заданного бита. Маска должна содержать единицу в проверяемом бите. Остальные биты маски нули. Выполняется битовая операция И и результат рассматривается как целое число. Если оно отлично от нуля, то бит находится в единичном состоянии, а если равно нулю – то в нулевом.
Пример.Проверить состояние бита с номером 1 и бита с номером 4.
1 0 1 0 1 (Исходный код) 1 0 1 0 1
· 0 0 0 1 0 (Маска) · 1 0 0 0 0
0 0 0 0 0 (Результат) 1 0 0 0 0
Вывод: бит с номером 1 находится в нулевом состоянии, а бит с номером 4 в единичном.
Установка заданных бит в нулевое состояние. Маска должна содержать нули в интересующих битах. Остальные биты маски единичные. Выполняется битовая операция И и ее результат записывается на место исходного кода. Единичные биты маски гарантируют сохранение состояния всех бит, кроме интересующих бит.
Пример.Установитьбиты с номерами 1 и 2 в нулевое состояние.
1 0 1 0 1 (Исходный код)
· 1 1 0 0 1 (Маска)
1 0 0 0 1 (Результат)
Установка заданных бит в единичное состояние. Маска должна содержать единицы в интересующих битах. Остальные биты маски нулевые. Выполняется битовая операция ИЛИ. Результат записывается на место исходного кода. Нулевые биты маски гарантируют сохранение состояния всех бит, кроме интересующих бит.
Пример.Установитьбиты с номерами 1 и 2 в единичное состояние.
1 0 1 0 1 (Исходный код)
Ú0 0 1 1 0 (Маска)
1 0 1 1 1 (Результат)
Инверсия заданных бит. Маска должна содержать единицы в интересующих битах. Остальные биты маски нулевые. Выполняется битовая операция М2. Результат записывается на место исходного кода. Нулевые биты маски гарантируют сохранение состояния всех бит, кроме интересующих бит.
Пример.Инвертировать биты с номерами 0,1 и 4.
1 0 1 0 1 (Исходный код)
Å 1 0 0 1 1 (Маска)
0 0 11 0 (Результат)
Достаточно часто возникает задача занесения в поле заданного кода. Решение этой задачи может потребовать установки битов в разное состояние. В качестве примера рассмотрим задачу занесения кода 001в биты с номерами 3,2,1.
В этом случае можно использовать один из следующих методов:
1. Последовательная установка бит сначала в одно состояние, а потом в другое.
1 0 1 0 1 (Исходный код)
Ú 0 0 0 1 0 (Маска для установки единицы)
1 0 1 1 1 (Единица занесена)
· 1 0 0 1 1 (Маска для установки нулей)
1 0 0 1 1 (Нули занесены)
2. Обнуление заданного поля и занесение в него кода через операцию битового ИЛИ.
Маска в этом случае должна содержать в интересующих битах заданный код. Остальные биты нулевые.
1 0 1 0 1 (Исходный код)
· 1 0 0 0 1 (Маска для обнуления)
1 0 0 0 1 (Нули занесены)
Ú 0 0 0 1 0 (Маска для занесения кода)
1 0 0 1 1 (Код занесен)
Предпочтительным является второй метод. Он обеспечивает решение задачи при заранее неизвестном по значению коде.
Сдвиговые операции
Выполняют направленное перемещение битов в пределах разрядной сетки. Сдвиг в сторону старших разрядов называют сдвигом влево, а в сторону младших разрядов - сдвигом вправо. В зависимости от способа заполнения освободившихся разрядов различают три вида сдвигов:
v Арифметический;
v Логический;
v Циклический.
Арифметический сдвиг. Вытолкнутые биты теряются. При сдвиге влево освобождающиеся правые биты заполняются нулем. При сдвиге вправо освобождающиеся левые биты заполняются значением старшего (знакового) бита. Схемы арифметического сдвига на примере пятиразрядного кода показаны на Рис.2.
Логический сдвиг. Независимо от направления сдвига освобождающиеся биты заполняются нулями. Схемы логического сдвига на примере пятиразрядного кода показаны на Рис.3.
Если сдвигаемый код представляет собой код целого числа без знака, то логический сдвиг влево на n разрядов равносилен умножению числа на 2n, а логический сдвиг вправо - делению числа на 2n.
Циклический сдвиг. При логическом и арифметическом сдвиге вытолкнутые за разрядную сетку биты безвозвратно теряются. При циклическом сдвиге вытолкнутые биты записываются на место освободившихся битов. Схемы циклического сдвига на примере пятиразрядного кода показаны на Рис.4.
Циклический сдвиг влево или вправо на n битов, где n равно длине разрядной сетки, приведет к получению исходного двоичного кода. Для рассмотренных примеров исходный код будет получен при сдвиге на пять бит
Типичной областью применения сдвигов является программная реализация умножения и деления.
Операции пересылки
Применяются для перемещения данных в памяти. Чаще всего приходится пересылать данные между ячейками основной памяти и регистрами общего назначения.
Дата добавления: 2019-02-08; просмотров: 611;