б. ! О
в. 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
Я
зык С построен на основе ключевых слов, выражений, операторов, а также правил их использования. Однако стандарт С не ограничивается описанием одного лишь языка. В нем также определено, что должен делать препроцессор, установлено, какие функции формируют стандартную библиотеку С, и детализировано, каким образом работают эти функции. В этой главе мы исследуем препроцессор и библиотеку С, и начнем мы с препроцессора.
Читать дальше