Архитектура компьютеров. Рыбалка С.А.
Лабораторная работа № 2
Бинарные операции
Тема: Бинарные операции
Цель работы: Освоить выполнение операций над данными в бинарном представлении
Задание
Прочитать методические указания.
Выполнить задания.
Оформить отчет.
Методические указания
Бинарные операции
Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит. Каждый бит может принимать одно из значений ноль (0) или единица (1). Т.е. вся информация любого вида в памяти компьютера это всего лишь последовательность нулей и единиц. Минимальный адресуемый объем памяти составляет один байт, который состоит из 8 бит. Как правило, любое число целого типа будет занимать два байта в памяти, т.е. 16 бит. При выполнении различных операций это множество бит можно рассматривать двояко: либо как целое число, либо как последовательность бит, что возможно при использовании битовых операций.
При отображении байта или слова по битам принято отображать справа налево (младшие разряды отображаются справа):
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
1 |
0 |
0 |
1 |
0 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
Рис. 1. Пример отображения 16-ти разрядного слова по битам
Битовые операции выполняются независимо над каждым битом данных. Если операция двуместная, то она выполняется над соответствующими битами двух операндов. В различных языках программирования имеются следующие битовые операции:
Таблица 1
Побитовые операции
Название операции |
Вид операции |
Оператор языка C++ |
Битовое отрицание |
Одноместная |
~ |
Побитовое "и" |
Двуместная |
& |
Побитовое "исключающие или" |
Двуместная |
^ |
Побитовое "или" |
Двуместная |
| |
Результат этих операций определяет таблица значений для всевозможных комбинаций бит двух операндов op1 и op2.
Таблица 2
Результаты логических операций
op1 |
op2 |
~op1 |
op1 & op2 |
op1 ^ op2 |
op1 | op2 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
0 |
1 |
Рассмотрим несколько примеров на данных из четырех бит.
Таблица 3
Примеры выполнения операций над бинарными данными
Операнды |
Операция |
Результат |
1010 |
~ |
0101 |
1010 1100 |
& |
1000 |
1010 1100 |
^ |
0110 |
1010 1100 |
| |
1110 |
Двуместные операции в программировании часто используются для выполнения операции маскирования. В этом случае значение результата воспринимается как значение первого операнда, но модифицированное значением маски (второго операнда) с учетом выполненной операции. Такие операции позволяют:
выделять один или несколько бит в байте (8 бит) или слове (16 бит);
устанавливать отдельный или несколько бит в значение ‘1’;
устанавливать отдельный или несколько бит в значение ‘0’.
Языки программирования (в том числе и C++), как правило, не имеют команд анализа и операций с отдельным битом. Нет таких и команд процессора. Но используя маски можно легко устанавливать отдельные биты в требуемые значения. Для установки бита в значение ‘0’ используется команда ‘И’, а для установки в ‘1’ — ‘ИЛИ’. При этом надо помнить, что остальные биты в результирующей комбинации должны остаться в том же состоянии, что и в исходном операнде. Тогда, если внимательно проанализировать таблицу 2, понятно, что во втором операнде (маске) в неизменных битах необходимо установить ‘1’ при операции установки битов в ‘0’; и в значение ‘0’, если необходимо установить в отдельных битах ‘1’. Другими словами, маска в любом случае состоит из двух частей: первая — биты которые необходимо установить в конкретное значение, вторая — биты которые должны остаться неизменными. При установке битов в ‘0’ используем операцию ‘и’, в маске устанавливаемые биты заполняем значением ‘0’, а неизменные — в ‘1’. При установке битов в ‘1’ используем операцию ‘или’, в маске устанавливаемые биты заполняем значением ‘1’, а неизменные — в ‘0’.
Пример 1. Установить биты 1 и 2 в значение ‘0’.
Решение. Используем операцию ‘и’ и маску 1001. Тогда, например, комбинация 0101 изменится следующим образом: 0101 & 1001= 0001.
Пример 2. Установить биты 1 и 2 в значение ‘1’.
Решение. Используем операцию ‘или’ и маску 0110. Тогда, например, комбинация 0101 изменится следующим образом: 0101 | 0110= 0111.
Иногда при программировании приходится использовать флаги — ячейки указывающие, например, что произошло определенное событие. Часто достаточно двоичного флага. Эти операции обычно и используются для установки или сброса флагов.
Выделение бит обычно осуществляется в два шага:
установки в ноль ‘ненужных’ бит в значение ‘0’ (делается сброс этих бит);
сдвига вправо так, чтобы самый правый бит, из тех который требовалось выделить, стал нулевым (занял позицию ноль).
Пример 3. Выделить биты 1 и 2 и узнать значение в этих битах.
Решение. Используем операцию ‘и’ и маску 0110. То есть по такой маске будут подавленны биты 0 и 3, а биты 1 и 2 останутся неизменными. Тогда, например, комбинация 0101 после применения маски и сдвига вправо на одну позицию даст следующий результат: 0101 & 0110=0100 00102=210.
Примечание. При сдвиге вправо левые биты заполняются нулями. Перевод числа из двоичной системы счисления в десятичную, будет рассмотрен позже.
Так можно узнать какое значение (число) записано в нескольких идущих подряд битах, но стоящих в середине слова. Если необходимо узнать значение записанное в нескольких младших разрядах (включая разряд 0), то приводят в состояние ‘0’ все старшие разряды, а сдвига не производят (или сдвигаются на ноль позиций).
Арифметические операции
Стандартными операциями над целыми числами являются операции сложения, вычитания, умножения и деления.
В простейшем случае эти операции можно выполнять аналогично привычным знакомым действиям в десятичной системе. Но необходимо помнить, что это двоичная система счисления.
Для лучшего понимания сложения рассмотрим полную таблицу сложения одноразрядных двоичных чисел:
+ |
0 |
1 |
0 |
0 |
1 |
1 |
1 |
10 |
Здесь 10 означает единицу в переносе ("в уме"), то есть количество разрядов в сумме стало на один разряд больше, чем в каждом из слагаемых. То есть результат будет двузначным числом. То есть всегда надо помнить, что при суммировании происходит переполнение по разряду и это переполнение переносится в старшие разряды. Сумма чисел может иметь большую разрядность, чем слагаемые.
Пример 4. Найти сумму двоичных чисел 0110 и 0100.
Решение. Сложение можно выполнять привычным методом в столбик.
0110
+ 0100
1010
Аналогично можно выполнять и вычитание двоичных чисел. При этом необходимо помнить, что при необходимости придется занимать старший разряд.
Пример 5. Найти разность двоичных чисел 0110 и 0100.
Решение. Вычитание можно выполнять привычным методом в столбик.
0110
– 0100
0010
Подобно вычислениям ‘в столбик’ в десятичной системе, вычисления выполняются и в двоичной системе. Причем умножение в двоичной системе выполнять даже проще: достаточно записать первый сомножитель столько раз и с таким сдвигом, в зависимости от того в каких разрядах установлена ‘1’(единица) во втором сомножителе.
Пример 6. Найти произведение двоичных чисел 0110 и 0100.
Решение. Умножение можно выполнять привычным методом в столбик.
0110
* 0100
0110__
011000