Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Название:Язык программирования C. Лекции и упражнения (6-е изд.) 2015
- Автор:
- Жанр:
- Издательство:Вильямс
- Год:0101
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стивен Прата - Язык программирования C. Лекции и упражнения (6-е изд.) 2015 краткое содержание
Язык программирования C. Лекции и упражнения (6-е изд.) 2015 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Вдобавок в С имеются операции сдвига влево (<<) и вправо (>>). Каждая из них создает значение, формируемое путем сдвига битов (влево или вправо) левого операнда на количество позиций, указанное в правом операнде. При операции сдвига влево освобождаемые биты устанавливаются в 0. При операции сдвига вправо освобождаемые биты устанавливаются в 0 для значений без знака. Для значений со знаком поведение операции сдвига вправо зависит от реализации.
Для обращения к отдельным битам или к группе битов в значении можно применять битовые поля. Детали такого манипулирования зависят от реализации.
С помощью операции _Alignas можно устанавливать требования к выравниванию при сохранении данных. Инструменты для работы с битами помогают программам на С взаимодействовать с оборудованием, поэтому они чаще всего привязаны к контексту конкретной реализации.
Вопросы для самоконтроля
Ответы на вопросы для самоконтроля приведены в приложении А.
1. Преобразуйте следующие десятичные значения в двоичную форму:
а. 3
б. 13
в. 59
г. 119
2. Преобразуйте следующие двоичные значения в десятичную, восьмеричную и
шестнадцатеричную форму:
а. 00010101
б. 01010101
в. 01001100
г. 10011101
3. Вычислите следующие выражения; предположите, что каждое значение имеет
8 битов:
Манипулирование битами 657
4. Вычислите следующие выражения; предположите, что каждое значение имеет 8 битов:
а. ~0
б. ! О
в. 2 & 4
г. 2 && 4 Д. 2 | 4
е. 2||4
ж. 5 << 3
5. Поскольку в ASCII-коде используются только последние 7 битов, иногда желательно маскировать остальные биты. Как будет выглядеть подходящая маска в двоичной форме? В десятичной? В восьмеричной? В шестнадцатеричной?
6. В листинге 15.2 следующий код
while (bits-- > 0)
{
mask |= bitval; bitval <<= 1;
}
можно заменить таким фрагментом:
while (bits-- > 0)
{
mask += bitval; bitval *= 2;
}
и программа по-прежнему будет работать. Означает ли это, что действие *= 2 эквивалентно <<= 1? А как насчет | = и +=?
7. а. Компьютер Tinkerbell содержит в специальном байте информацию, касающу
юся оборудования. Этот байт может быть прочитан программой, и он содержит следующую информацию:
Подобно IBM PC, компьютер Tinkerbell заполняет битовые поля структуры справа налево. Создайте шаблон битовых полей, подходящий для хранения информации.
б. Компьютер Klinkerbell, ближайший клон Tinkerbell, заполняет битовые ноля структур слева направо. Создайте соответствующий шаблон битовых нолей для системы Klinkerbell.
658 глава 15
Упражнения по программированию
1. Напишите функцию, которая преобразует строку с двоичным представлением в числовое значение. Другими словами, если есть
char * pbin = "01001001";
то переменную pbin можно передать этой функции в качестве аргумента, и функция должна возвратить значение 2 5 типа int.
2. Напишите программу, которая читает две строки с двоичным представлением как аргументы командной строки и выводит результаты применения операции ~ к каждому числу, а также результаты применения операций &, | и ^к паре чисел. Отобразите результаты в виде двоичных строк. (Если среда командной строки недоступна, обеспечьте в программе интерактивный ввод строк.)
3. Напишите функцию, которая принимает аргумент типа int и возвращает количество включенных битов в нем. Протестируйте функцию в какой-нибудь программе.
4. Напишите функцию, которая принимает два аргумента типа int: значение и позицию бита. Функция должна возвращать 1, если бит в этой позиции равен 1, и О в противном случае. Протестируйте функцию в какой-нибудь программе.
5. Напишите функцию, которая циклически сдвигает биты значения типа unsigned int на указанное количество позиций влево. Например, функция rotate l (х, 4) перемещает биты значения х на четыре позиции влево, при этом утраченные слева биты воспроизводятся в правой части комбинации. Другими словами, вытесненный старший бит помещается в позицию младшего бита. Протестируйте функцию в какой-нибудь программе.
6. Разработайте структуру битовых полей, которая содержит следующую информацию:
• Идентификатор шрифта: число от 0 до 255
• Размер шрифта: число от 0 до 127
• Выравнивание: число от 0 до 2, представляющее опции выравнивания влево, по центру и вправо
• Полужирный: отключен (0) или включен (1)
• Курсив: отключен (0) или включен (1)
• Подчеркнутый: отключен (0) или включен (1)
Используйте эту структуру в программе, которая отображает параметры шрифта и дает пользователю возможность менять параметры с помощью циклического меню. Ниже приводится пример выполнения программы:
Манипулирование битами 659
Введите размер шрифта (0-127) : 36
Чтобы обеспечить преобразование вводимых значений идентификатора и размера шрифта в значения из указанного диапазона, программа должна применять операцию & и подходящие маски.
7. Напишите программу с таким же поведением, как в упражнении 6, но используйте для хранения информации о шрифте переменную типа unsigned long, а для манипулирования этой информацией — побитовые операции вместо членов струк туры с битовыми полями.
16
Препроцессор и библиотека С
В ЭТОЙ ГЛАВЕ...
• Директивы препроцессора: #define, #include, #ifdef, #else, tendif, #ifndef, #if, #elif, #line, #error, #pragma
• Ключевые слова: _Generic, _Noreturn, _Static_assert
• Функции/макросы: sqrt(), atan(), atan2(), exit(), atexit(), assert(), memcpy(), memmove(), va_start(), va_arg(), va_copy(), va_end()
• Дополнительные возможности препроцессора С
• Функциональные макросы и условная компиляция
• Встраиваемые функции
• Библиотека С и ее некоторые удобные функции
662 Глава 16
Я
зык С построен на основе ключевых слов, выражений, операторов, а также правил их использования. Однако стандарт С не ограничивается описанием одного лишь языка. В нем также определено, что должен делать препроцессор, установлено, какие функции формируют стандартную библиотеку С, и детализировано, каким образом работают эти функции. В этой главе мы исследуем препроцессор и библиотеку С, и начнем мы с препроцессора.
Препроцессор, согласно своему названию, анализирует программу до ее компиляции. Следуя указанным директивам, препроцессор заменяет символические сокращения в программе сущностями, которые они представляют. По вашему запросу препроцессор может включать другие файлы, и вы можете выбирать, какой код будет видеть компилятор. Препроцессору ничего не известно о языке С. По существу он преобразует один текст в другой. Правда, такое описание не дает точного представления об истинной пользе и значимости препроцессора, поэтому давайте перейдем к примерам. Вы уже неоднократно встречали директивы #define и #include. Теперь можно объединить и расширить полученные знания.
Читать дальшеИнтервал:
Закладка: