
- •Общие методические указания по выполнению лабораторных работ
- •Работа со структурами данных (struct)
- •Описание структур и структурных переменных
- •Вложенные структуры
- •Обращение к полям структуры
- •Например, для переменных, описанных шаблоном
- •Массивы структурных переменных
- •Объявление типов в языке Си
- •Введите оценки ( 2 целых числа от 3 до 5 ): 5 5
- •Использование структур в функциях
- •Использование глобальных данных
- •Обработка вложенных структур
- •Толстой л.Н. Война и мир 1995 6 Структуры и поразрядные операции
- •Поразрядные операции
- •Сдвиговые поразрядные операции
- •Операнд сдвиг число_битов
- •Структуры с битовыми полями
- •Работа с объединениями (union)
- •Работа с перечислениями (enum)
- •Работа с файлами Понятие файла и потока ввода-вывода данных в компьютере
- •Открытие и закрытие файла
- •Потоки стандартного ввода-вывода
- •Повторное открытие файла
- •Позиционирование указателя записи-чтения
- •Int fseek (указатель_потока, (long) смещение, начало_отсчета),
- •Начало_отсчета может принимать следующие значения:
- •Функции файлового ввода-вывода
- •Посимвольный ввод-вывод
- •Вывод символов из файла:
- •Построчный ввод-вывод Пусть описан символьный массив
- •Форматированный ввод-вывод данных
- •Блоковый ввод-вывод
- •Работа с динамическими структурами данных Динамическое распределение памяти
- •Очередь
- •Рекурсивные функции
- •Деревья
Толстой л.Н. Война и мир 1995 6 Структуры и поразрядные операции
В языке СИ есть возможность работать с отдельными разрядами (битами) байтов и слов. Операции с битами бывают необходимы в случае, если программист работает на уровне близком к машинному, что характерно для задач системного программирования. Каждый бит может принимать значения 0 или 1.
Поразрядные операции
Эти операции предназначены для изменения отдельных разрядов данных целых типов. Они используются для обработки двоичных кодов данных целых типов int (signed - со знаком и unsigned - без знака), а также символьных типов char и unsigned char. Поразрядные операции делятся на логические и сдвиговые операции.
Поразрядные логические операции с учетом их приоритетов (1– высший) представлены в табл. 1.
Таблица 1
Приоритет |
Название операции |
Символ операции |
1 2 3 4 |
НЕ (инверсия, отрицание) И (логическое умножение) ИЛИ исключающее (сложение по mod 2) ИЛИ (логическое сложение) |
~ & ^ | |
Операция НЕ является унарной, остальные – бинарными.
Результаты поразрядных логических операций над битами A[i] , B[i] операндов целых типов представлены в табл.2.
Таблица 2
Значения битов |
Операции |
||||
A[i] |
B[i] |
~ A[i] |
A[i] & B[i] |
A[i] ^ B[i] |
A[i] | B[i] |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
0 |
0 |
Каждая из поразрядных операций служит определенным целям. Рассмотрим применение этих операций на примерах с однобайтовыми словами. Пусть, например, описаны переменные:
unsigned char a, b, c;
Операция НЕ (~) изменяет значения всех битов слова на противоположные, например, пусть а=0.
Пример. Двоичный код: Десятичный код:
а= 00000000 0
~a=11111111 225
Операция И (&) устанавливает бит результата в 1, если соответствующие биты операндов равны 1. Это полезно для проверки того, что конкретные биты установлены в 1, а также для обнуления (маскирования ) битов.
Пример. Пусть задан код а=10110000 и требуется обнулить старший разряд. Положим код b=01111111 (число 127), тогда
а = 10110000
b = 01111111
a&b = 10110000
Операция ИЛИ ( | ) устанавливает бит результата в 1, если хотя бы один из соответствующих операндов равен 1, то есть она полезна для установки битов в 1.
Пример. Пусть а=00110000 и требуется установить 1 в старшем и младшем разрядах, тогда
a = 10110000
b = 10000001
a | b = 10110001
Операция исключающего ИЛИ (^) устанавливает бит результата в 1, если соответствующие биты операндов различны, что можно использовать для проверки и переключения битов.
Пример. В переменной a требуется изменить значение старшего разряда на противоположное. Положим b=10000000 (код маски), тогда:
a = 01110001 б) a = 11110001
b = 10000000 b = 10000000
a ^ b = 11110001 a ^ b = 01110001