Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Практическое занятие №3. Битовые операции




Цель работы

Целью практического занятия является получение практических навыков в работе с побитовыми логическими операциями и операциями сдвига языка C.

Темы для предварительного изучения

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

Задание для выполнения

Составить две программы, первая из которых вводит составные части структуры данных, приведенной в Вашем варианте индивидуального задания, и формирует из них заданную упакованную структуру. Вторая программа вводит упакованную структуру как 16-ричное число и выводит значения отдельных ее составных частей.

Варианты индивидуальных заданий

Вариант 1

Физический адрес на диске представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
                                 
Значение H H T T T T T T T T T S S S S S

где:

HH - номер головки
T..T - номер дорожки
S..S - номер сектора

Вариант 2

Слово состояния программы в вычислительной системе представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C C C E I P 0 0 0 K K K 0 0 0

 

где: C..C - маски каналов 0 - 3
E - маска внешнего прерывания
I - маска внутреннего прерывания
P - маска программного прерывания
KKK - ключ защиты памяти

 

Вариант 3

Слово состояния канала в вычислительной системе представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение N N N N E C C C C C C C C C 0 P

где:

N..N - номер канала
E - признак ошибки
C..C - код причини прерывания
P - признак завершения программы в канале

 

Вариант 4

Формат команды загрузки/сохранения в вычислительной системе имеет вид:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение 1 1 1 0 0 0 1 D R R R R A A A A

где:

D - направление передачи - в регистр(0)/в память(1)
R..R - 1-й операнд - регистр
A..A - регистр адреса 2-го операнда

 

Вариант 5

Слово состояния оборудования для вычислительной системы представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение P P P 0 F F 0 H H H H 0 0 V V V

где:

PPP - количество принтеров
FF - количество гибких дисков
H..H - тип жесткого диска
VVV - тип видеоадаптера

 

Вариант 6

Формат команды сдвига в вычислительной системе имеет вид:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение 1 1 0 1 T T D N N N N N N N N N

где:

TT - тип сдвига
D - направление сдвига
N..N - количество разрядов сдвига

 

Вариант 7

Блок управления буфером кеша в вычислительной системе представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение S S S 0 D 0 F 0 B B B B B B B B

где:

SSS - код системной области или 000
D - признак "грязного" буфера
F - признак свободного буфера
B..B - номер блока, который отображен в буфере

 

Вариант 8

Элемент списка безопасности объекта в вычислительной системе представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение U U U U U U U U R W E 0 0 0 0 X

где:

U..U - идентификатор пользователя
R - право читать
W - право писать
E - право выполнять программный код
X - явный запрет доступа

 

Вариант 9

Формат команды канала всистема ввода-вывода имеет вид:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение O O O O O C D N N N N N N N N N

где:

O..O - код операции
C - признак цепочки команд
D - признак цепочки данных
N..N - количество байтов для передачи

 

Вариант №10

Элемент профиля пользователя в вычислительной системе представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение G G G G G G G G S S S S P 0 0 0

где:

G..G - идентификатор группы, к которой принадлежит пользователь
S..S - код системы, которая загружается для пользователя
P - признак привилегированного пользователя

 

Вариант 11

Информация о состоянии устройства в системе ввода-вывода представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C C U U U U U E E E E E E 0 B

где:

CCC - номер канала
U..U - номер устройства в канале
E..E - код состояния
B - признак занятости устройства

 

Вариант 12

Формат команды сложения в вычислительной системе имеет вид:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение 1 1 0 0 0 1 1 0 D A A A B B B 0

где:

D - сложение байтов/слов - 0/1
AAA - регистр - 1-й операнд
BBB - регистр - 2-й операнд

 

Вариант 13

Формат представления текущей даты в некоторых системных структурах имеет вид:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение D D D D D M M M M M Y Y Y Y Y Y

где:

D..D - день
M..M - месяц
Y..Y - год после 1980

 

Вариант 14

Формат представления текущего времени в некоторых системных структурах имеет вид:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение S S S S S M M M M M M H H H H H

где:

S..S - секунды/2
M..M - минуты
H..H - часы

 

Вариант 15

Дескриптор сегмента для системы виртуальной памяти представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение F F F F F F F F R W L L L L L L

где:

F..F - номер блока, с которого начинается сегмент
R - доступ для чтения
W - доступ для записи
L..L - размер сегмента в блоках

 

Вариант 16

Атрибут файла в файловой системе представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение T T T T A A A 0 I I I I I I I I

где:

T..T - код типа файла
AAA - код доступа
I..I - номер файлового индекса

 

Вариант 17

Блок управления памятью в операционной системе имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение O O O O O O O O 0 P L L L L L L

где:

O..O - идентификатор владельца блока
P - признак программного блока
L..L - размер блока

 

Вариант 18

Точка изображения на 16-цветном дисплее с размером экрана 64х64 описывается в формате:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение X X X X X X Y Y Y Y Y Y C C C C

где:

X..X - горизонтальная координата
Y..Y - вертикальная координата
C..C - цвет

 

Вариант 19

Управляющее слово программируемого таймера имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C F F D D D D D D D D D D D D

где:

CC - номер канала таймера
FF - форма сигнала
D..D - коэффициент деления опорной частоты

 

Вариант 20

Информация о критической ошибке на диске представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение O A A R R R 0 1 D D D D D D D D

где:

O - тип операции - чтение/запись (0/1)
AA - код области диска
RRR - возможные реакции на ошибку
D..D - номер диска

 

Вариант 21

Дескриптор сообщения в системе телекоммуникаций имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение N N N N 0 P P P U U U U U U U U

где:

N..N - номер узла, из которого пришло сообщение
PPP - приоритет сообщения
U..U - идентификатор пользователя - автора сообщения

 

Вариант 22

Дескриптор семафора, который защищает пул ресурсов, имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение N N N M M M 0 L W W W W W W W W

где:

N..N - текущее количество свободных единиц ресурса
M..M - общее количество единиц ресурса
L - признак блокирования/разблокирования семафора (1/0)
W..W - количество процессов, которые ожидают доступа к ресурсу

 

Вариант 23

Заголовок кадра в системе передачи данных имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение S S S S S S D D D D D D 0 C C C

где:

S..S - адрес источника
D..D - адрес приемника
CCC - управляющий код

 

Вариант 24

Заголовок пакета в системе передачи данных имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение T T T 0 S S S S L L L L L L L L

где:

TTT - тип пакета
S..S - идентификатор источника
L..L - длина пакета

 

Вариант 25

Поле управления диспетчером кадра в протоколе управления логическим каналом имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение 1 0 C C 0 0 0 0 P N N N N N N N

где:

CC - управляющий код
P - признак запроса или завершения (0/1)
N..N - номер последовательности

 

Вариант 26

Формат заголовка пакета в системе ретрансляции кадров такой:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C C C C C C C C C R E E E E E

где:

C..C - идентификатор канала передачи
R - признак команды / ответа (0/1)
E..E - расширение адреса

 

Вариант 27

Формат элемента доступа к объекту в системе безопасности такой:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение 0 A A A T T M 0 G G G G G G G G

где:

AAA - код доступа к объекту из группы PUBLIC
TT - доступ для чтения и/или доступ для записи
G..G - код группы доступа, к которой принадлежит объект

 

Вариант 28

Дескриптор массива, который формируется компилятором языка программирования, имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение L L L L 0 0 B B B B B E E E E E

где:

L..L - размер элемента массива
B..B - начальный индекс
E..E - конечный индекс

 

Вариант 29

Блок управления сегментом памяти в системе с реальной памятью имеет формат:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение T T T T T 0 A 0 L L L L L L L L

где:

T..T - идентификатор задачи, которой принадлежит сегмент или 0 - для свободного сегмента
A - признак активности задачи (1/0)
L..L - длина сегмента

 

Вариант 30

Слово состояния устройства в системе ввода-вывода представляется в виде:

№ разряда 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Значение C C C C C 0 F B N N N N N N N N

где:

C..C - код состояния
F - признак ошибки (1/0)
B - признак занятости (0/1)
N..N - количество байт, переданных в последней операции

Пример решения задачи (вариант 30)

Программа упаковки

5.1.1. Разработка алгоритма решения.

Алгоритм программы линейный и состоит из следующих шагов.

5.1.1.1. Ввод значений составных частей слова состояния устройства. Для каждой составной части нужно вывести приглашение на ввод и ввести данные.

5.1.1.2. Занесение в слово состояния устройства кода состояния. У переменной, которая хранит значение кода состояния, нужно выделить 5 младших разрядов - это можно сделать, выполнив операцию "побитовое логическое И" между значением переменной и двоичной константой 00011111 (16-ричной константой 1F). Потом полученное значения следует сдвинуть на 11 разрядов влево.

5.1.1.3. Занесение в слово состояния устройства признака ошибки. В переменной - признаке ошибки выделить один младший разряд - операция "побитовое логическое И" с константой 1. Полученное значение сдвинуть на 9 разрядов влево. Чтобы добавит полученный код к тому коду, который уже получен на предыдущем шаге, нужно выполнить операцию "побитовое логическое ИЛИ" между предыдущим значением слова состояния устройства и полученным кодом.

5.1.1.4. Занесение в слово состояния устройства признака занятости. В переменной - признаке занятости выделить один младший разряд. Полученное значение сдвинуть на 8 разрядов влево и добавить к тому коду, который получен на предыдущем шаге (так же как в пп.5.1.1.3.).

5.1.1.5. Занесение в слово состояния устройства количества байт. В переменной - количестве байт выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение добавить (см. пп.5.1.1.3.) к тому коду, который уже есть.

Отметим, что если значения составных частей кода, введенные оператором, не выходят за диапазон допустимых для них значений, то операция выделения младших байтов излишня. Но мы предусматриваем ее на случай ошибок оператора.

5.1.2. Определение переменных программы

Для работы программы нам будут нужны переменные, в которых будут храниться составные части кода. Для сохранения всех составных частей будет достаточно по 1 байту, следовательно, тип этих переменных может быть char или unsignedchar. Диапазоны возможных значений этих переменных: c - код состояния - 0 ...31; f - признак ошибки - 0, 1; b - признак занятости - 0, 1; n - количество байт - 0 ... 255. Отметим, что в переменных c, f, b старший разряд байта не используется, так что не имеет значения, будут они типа char или unsignedchar. В переменной n используется старший разряд, следовательно, она обязательно должна быть типа unsignedchar.

Нужна также переменная для сохранения результирующего кода слова состояния устройства. Это 2-байтная переменная, у которой старший разряд используется как кодовый, а не как знаковый. Так что, эта переменная должна быть типа unsignedint.

5.1.3. Разработка текста программы

Текст программы начинается с включения в программу файла:

#include<stdio.h>

В этом файле содержатся описания стандартных функций ввода-вывода, которые непременно будут использоваться в программе.

Далее идет заголовок функции main():

intmain(void) {

и объявления переменных - точно по пп 5.1.2:

char c;

char f;

char b;

unsigned char n;

unsignedintUnitStateWord;

Ввод кода состояния складывается из вывода на экран приглашения:

printf("Введите код состояния (0 - 31) >");

и собственно ввода значения в переменную c:

scanf("%d",&c);

Такие же пары операторов повторяются для ввода значений f, b, n. Все значения вводятся как десятичные числа, используется тип %d в спецификациях формата.

Далее идет формирование упакованного кода, которое точно повторяет шаги алгоритма описанного в пп. 5.1.1:

  • по пп.5.1.1.2:

· UnitStateWord=((unsigned char)c&0x1F)<<11;

Преобразование типа переменной c в unsignedchar необходимо, потому что иначе сдвиг 8-разрядного кода на 11 разрядов приведет к потере нужных нам кодов.

  • по пп.5.1.1.3:

· UnitStateWord|=((unsignedchar)f&1)<<9;

  • по пп.5.1.1.4:

· UnitStateWord|=((unsignedchar)b&1)<<8;

  • пл пп.5.1.1.5:

· UnitStateWord|=n&0xFF;

Вывод результата выполняется оператором:

printf("\nСлово состояния устройства = %04x\n",UnitStateWord);

Результат выводится как 16-ричное число из 4 цифр (что соответствует 2 байтам), обязательно выводятся ведущие нули.

Полный текст программы приведен ниже.

/******************************************************/

/*      Практическое занятие №4 (часть 1)    */

/*              Упаковка кода               */

/*       Пример выполнения. Вариант №30.    */

/******************************************************/

#include<stdio.h>

int main(void) {

charc; /* кодсостояния */

char f; /* признак ошибки */

char b; /* признак занятости */

unsignedcharn; /* количествобайт */

unsignedintUnitStateWord; /* словосостояния */

/* ввод составных частей */

printf("Введите код состояния (0 - 31) >");

scanf("%d",&c);

printf("Введите признак ошибки (0 / 1) >");

scanf("%d",&f);

printf("Введите признак занятости (0 / 1) >");

scanf("%d",&b);

printf("Введите количество переданных байт (0 - 255) >");

scanf("%d",&n);

/* формирование упакованного кода */

UnitStateWord=((unsigned int)c&0x1F)<<11;

UnitStateWord|=((unsigned int)f&1)<<9;

UnitStateWord|=((unsigned int)b&1)<<8;

UnitStateWord|=n&0xFF;

/* вывод результата */

printf("\nСлово состояния устройства = %04x\n",

UnitStateWord);

return 0;

}

5.1.4. Отладка программы

Отладку программы можно вести в пошаговом режиме с отслеживанием значений переменных - составных частей при их вводе и кода-результата на шагах его формирования. Для последнего может возникнуть неудобство, т.к. в режиме отладки значение переменной UnitStateWord будет представляться как десятичное число, а нам удобнее видеть его как 16-ричное или как 2-ичное. Поэтому для такого отслеживания удобнее будет вставить в соответствующие места текста программы вызовы функции printf, которые будут выводить промежуточные значения кода в 16-ричном формате.

5.1.5. Результаты работы программы

При работе программы на экран были выведены такие результаты:

Введите код состояния (0 - 31) >27

Введите признак ошибки (0 / 1) >1

Введите признак занятости (0 / 1) >1

Введите количество переданных байт (0 - 255) >74

 

Слово состояния устройства = db4a

Программа распаковки

5.2.1. Разработка алгоритма решения.

Алгоритм программы линейный и состоит из таких шагов.

5.2.1.1. Ввод значения слова состояния устройства.

5.2.1.2. Выделение из слова состояния устройства кода состояния. Код слова состояния устройства нужно сдвинуть на 11 разрядов вправо и выделить 5 младших разрядов - "побитовое логическое И" с константой 1F16. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для кода состояния.

5.2.1.3. Выделение из слова состояния устройства признака ошибки. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд - "побитовое логическое И" с константой 1. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака ошибки.

5.2.1.4. Выделение из слова состояния устройства признака занятости. Код слова состояния устройства сдвинуть на 9 разрядов вправо и выделить 1 младший разряд. Слово состояния устройства остается неизменным, а полученное значение записывается в переменную для признака занятости.

5.2.1.5. Выделение из слова состояния устройства количества байт. В коде слова состояния устройства нужно выделить 8 младших разрядов - "побитовое логическое И" с константой FF16. Полученное значение записывается в переменную для количества байт.

5.2.2. Определение переменных программы Для работы программы нам будут нужны такие же переменные, что и в пп. 5.1.2.

5.2.3. Разработка текста программы

Начало программы - заголовок и определение переменных - по пп. 5.1.3. Далее идет формирования упакованного кода, которое точно повторяет шаги алгоритма, описанного в пп. 5.2.1:

  • по пп.5.1.2.2:

· c=(UnitStateWord>>11)&0x1F;

  • по пп.5.1.2.3:

· f=(UnitStateWord>>9)&1;

  • по пп.5.1.2.4:

· b=(UnitStateWord>>8)&1;

  • по пп.5.1.2.5:

· n=UnitStateWord&0xFF;

Вывод первого результата - кода состояния выполняется оператором:

printf("Код состояния           = %d\n",c);

Подобными операторами выполняется и вывод остальных результатов

Полный текст программы приведен ниже.

/******************************************************/

/*      Практическое занятие №4 (часть 2)    */

/*            Распаковка кода               */

/*       Пример выполнения. Вариант №30.    */

/******************************************************/

#include<stdio.h>

int main(void) {

charc; /* кодсостояния */

char f; /* признак ошибки */

char b; /* признак занятости */

unsignedcharn; /* количествобайт */

unsignedintUnitStateWord; /* словосостояния */

/* ввод слова состояния устройства */

printf("Введите cлово состояния устройства \n");

printf("(16-ричное число от 0 до 0xFFFF) >");

scanf("%x",&UnitStateWord);

/* Выделение составных частей */

c=(UnitStateWord>>11)&0x1F;

f=(UnitStateWord>>9)&1;

b=(UnitStateWord>>8)&1;

n=UnitStateWord&0xFF;

/* вывод результатов */

putchar('\n');

printf("Код состояния             = %d\n",c);

printf("Признак ошибки        = %d\n",f);

printf("Признак занятости     = %d\n",b);

printf("Количество переданных байт = %d\n",n);

return 0;

}

5.2.4. Отладка программы

Отладка программы ведется по методике, описанной в пп.5.1.4.

5.2.5. Результаты работы программы

При работе программы на экран были выведены такие результаты:

Введите cлово состояния устройства

(16-ричное число от 0 до 0xFFFF) >cb42

 

Код состояния             = 25

Признак ошибки        = 1

Признак занятости     = 1

Количество переданных байт = 66

Выводы

При выполнении практического занятия изучены побитовые операции языка C++.

Контрольные вопросы

  1. Как осуществляется нумерация разрядов байта?
  2. Для каких систем счисления в языке С++ имеются классификаторы форматируемых данных?
  3. Какие логические поразрядные операции существуют в языке С++?
  4. Какие логические операции сдвига существуют в языке С++? Какими операторами они реализуются?
  5. Что такое битовое поле в языке С++? Где оно может быть определено?
  6. В чем отличие поразрядных и логических операторов НЕ, И и ИЛИ?
  7. Как можно обменять значения двух целочисленных переменных без использования третьей переменной?
  8. Чем отличается операция сдвига вправо для типов int и unsigned?

9. Как осуществляется считывание с консоли информация с помощью функции scanf_s()?

10. Как с консоли осуществляется считывание последовательности различных типов данных с помощью одной функции scanf_s()?

11. Как выводится на консоль последовательность различных типов данных с помощью одной функции printf()?

12. Поясните разницу между типами данных char и unsignedchar.

13. Какие типы констант и переменных использовались в вашей программе? Поясните представление чисел в двочной и шестнадцатиричной системах счисления.










Последнее изменение этой страницы: 2018-05-10; просмотров: 878.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...