Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Практическое занятие №3. Битовые операции
Цель работы Целью практического занятия является получение практических навыков в работе с побитовыми логическими операциями и операциями сдвига языка C. Темы для предварительного изучения Побитовые логические операции и операции сдвига. Задание для выполнения Составить две программы, первая из которых вводит составные части структуры данных, приведенной в Вашем варианте индивидуального задания, и формирует из них заданную упакованную структуру. Вторая программа вводит упакованную структуру как 16-ричное число и выводит значения отдельных ее составных частей. Варианты индивидуальных заданий Вариант 1 Физический адрес на диске представляется в виде:
где:
Вариант 2 Слово состояния программы в вычислительной системе представляется в виде:
Вариант 3 Слово состояния канала в вычислительной системе представляется в виде:
где:
Вариант 4 Формат команды загрузки/сохранения в вычислительной системе имеет вид:
где:
Вариант 5 Слово состояния оборудования для вычислительной системы представляется в виде:
где:
Вариант 6 Формат команды сдвига в вычислительной системе имеет вид:
где:
Вариант 7 Блок управления буфером кеша в вычислительной системе представляется в виде:
где:
Вариант 8 Элемент списка безопасности объекта в вычислительной системе представляется в виде:
где:
Вариант 9 Формат команды канала всистема ввода-вывода имеет вид:
где:
Вариант №10 Элемент профиля пользователя в вычислительной системе представляется в виде:
где:
Вариант 11 Информация о состоянии устройства в системе ввода-вывода представляется в виде:
где:
Вариант 12 Формат команды сложения в вычислительной системе имеет вид:
где:
Вариант 13 Формат представления текущей даты в некоторых системных структурах имеет вид:
где:
Вариант 14 Формат представления текущего времени в некоторых системных структурах имеет вид:
где:
Вариант 15 Дескриптор сегмента для системы виртуальной памяти представляется в виде:
где:
Вариант 16 Атрибут файла в файловой системе представляется в виде:
где:
Вариант 17 Блок управления памятью в операционной системе имеет формат:
где:
Вариант 18 Точка изображения на 16-цветном дисплее с размером экрана 64х64 описывается в формате:
где:
Вариант 19 Управляющее слово программируемого таймера имеет формат:
где:
Вариант 20 Информация о критической ошибке на диске представляется в виде:
где:
Вариант 21 Дескриптор сообщения в системе телекоммуникаций имеет формат:
где:
Вариант 22 Дескриптор семафора, который защищает пул ресурсов, имеет формат:
где:
Вариант 23 Заголовок кадра в системе передачи данных имеет формат:
где:
Вариант 24 Заголовок пакета в системе передачи данных имеет формат:
где:
Вариант 25 Поле управления диспетчером кадра в протоколе управления логическим каналом имеет формат:
где:
Вариант 26 Формат заголовка пакета в системе ретрансляции кадров такой:
где:
Вариант 27 Формат элемента доступа к объекту в системе безопасности такой:
где:
Вариант 28 Дескриптор массива, который формируется компилятором языка программирования, имеет формат:
где:
Вариант 29 Блок управления сегментом памяти в системе с реальной памятью имеет формат:
где:
Вариант 30 Слово состояния устройства в системе ввода-вывода представляется в виде:
где:
Пример решения задачи (вариант 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:
· UnitStateWord=((unsigned char)c&0x1F)<<11; Преобразование типа переменной c в unsignedchar необходимо, потому что иначе сдвиг 8-разрядного кода на 11 разрядов приведет к потере нужных нам кодов.
· UnitStateWord|=((unsignedchar)f&1)<<9;
· UnitStateWord|=((unsignedchar)b&1)<<8;
· 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:
· c=(UnitStateWord>>11)&0x1F;
· f=(UnitStateWord>>9)&1;
· b=(UnitStateWord>>8)&1;
· 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++. Контрольные вопросы
9. Как осуществляется считывание с консоли информация с помощью функции scanf_s()? 10. Как с консоли осуществляется считывание последовательности различных типов данных с помощью одной функции scanf_s()? 11. Как выводится на консоль последовательность различных типов данных с помощью одной функции printf()? 12. Поясните разницу между типами данных char и unsignedchar. 13. Какие типы констант и переменных использовались в вашей программе? Поясните представление чисел в двочной и шестнадцатиричной системах счисления. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Последнее изменение этой страницы: 2018-05-10; просмотров: 878. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |