Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 2.doc
Скачиваний:
13
Добавлен:
29.05.2015
Размер:
194.56 Кб
Скачать

Архитектура компьютеров. Рыбалка С.А.

Лабораторная работа № 2

Бинарные операции

Тема: Бинарные операции

Цель работы: Освоить выполнение операций над данными в бинарном представлении

Задание

  1. Прочитать методические указания.

  2. Выполнить задания.

  3. Оформить отчет.

Методические указания

Бинарные операции

Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит. Каждый бит может принимать одно из значений ноль (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