- •6. Функции в языке с
- •6.1 Описание функции
- •Void main()
- •6.2 Вызов функции
- •6.3 Варианты описания и использования функций
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •Void main()
- •7. Работа со строками
- •7.1 Способы описания строк в программе
- •7.2 Ввод-вывод строк
- •7.3 Функции для работы со строками
- •8. Структуры и объединения в языке с
- •8.1 Описание структур
- •8.2 Инициализация структур
- •8.3 Работа с элементами структур
- •8.4 Структуры и указатели
- •8.5. Битовые поля в структурах
- •Работа с битовыми полями:
- •8.6. Объединения
- •Работа с полями объединения
- •8.7. Отличие объединения от структуры
- •8.8. Применение объединений
- •Void main()
- •9. Файлы в языке c. Функции работы с файлами
- •A) чтение данных из файла
- •Б) запись данных в файл
- •Дополнительные функции для работы с файлами
- •10. Программирование в графическом режиме
- •Функции библиотеки graphics
- •Управление графической системой Управление графическим режимом производится с помощью следующих функций:
- •Черчение и заполнение
- •Управление цветом
- •Обработка ошибок в графическом режиме
- •Функции запроса состояния
- •Void main()
- •11. Директивы препроцессора
- •11.1. Директива #include
- •11.2. Директива #define
- •11.3. Директива #undef
- •12. Побитовые (поразрядные) операции
- •Использование побитовых операций
11.3. Директива #undef
Директива #undef используется для отмены действия директивы #define. Синтаксис этой директивы следующий #undef идентификатор
Директива отменяет действие текущего определения #define для указанного идентификатора. Не является ошибкой использование директивы #undef для идентификатора, который не был определен директивой #define.
Пример:
#undef WIDTH
#undef MAX
Эти директивы отменяют определение именованной константы WIDTH и макроопределения MAX.
12. Побитовые (поразрядные) операции
В языке С предусмотрен ряд операций для работы с битами (двоичными разрядами). Эти операции выполняются над переменными и выражениями целого типа и их нельзя применять к переменным типа float или double.
К поразрядным операциям относятся следующие:
& побитовое 'and' ( A & B)
| побитовое включающее 'or' ( A | B)
^ побитовое исключающее 'or' ( A ^ B)
~ дополнение (унарная операция ~ A )
<< сдвиг влево ( A << N)
>> сдвиг вправо ( A >> N)
Каждый бит результата для первых четырех операций определяется в соответствии с таблицей 1.
Таблица 1. Таблица истинности для поразрядных операций
Значение A |
Значение В |
A & B |
A | B |
A ^ B |
~ A |
0 1 0 1 |
0 0 1 1 |
0 0 0 1 |
0 1 1 1 |
0 1 1 0 |
1 0 1 0 |
Операции сдвига << и >> осуществляют соответственно сдвиг влево и право своего левого операнда на число битовых позиций, задаваемых правым операндом.
Результатом операции A << N является значение A, сдвинутое влево на N разрядов и заполненное справа нулями.
Результатом операции A >> N является значение A, сдвинутое вправо на N разрядов. Если A имеет тип unsigned, то происходит его заполнение нулями слева. Если же A имеет тип signed, то заполнение слева выполняется знаком (0 для положительных и 1 для отрицательных значений).
Пример.
х<<2 сдвигает х влево на две позиции, заполняя освобождающиеся биты нулями, что эквивалентно умножению на 4.
х>>3 сдвигает х вправо на три позиции, заполняя освобождающиеся биты нулями, что эквивалентно делению на 8.
Использование побитовых операций
1. Побитовая операция 'and' часто используется для маскирования некоторого множества битов, например:
unsigned c, n=0xD9AE;
c = n & 0x1FF;
передает в 'с' девять младших битов n, остальные полагаются равными нулю.
2. Операция | побитового 'or' используется для включения битов, например:
unsigned c, mask=0xF4C5;
c = с | mask;
устанавливает в 1 те биты в 'с', которые равны 1 в mask.
3. Унарная операция ~ дает дополнение к целому; это означает, что каждый бит со значением 1 получает значение 0 и наоборот. Эта операция обычно оказывается полезной в выражениях типа
x & ~077
где последние шесть битов х маскируются нулем.
Пример. Составить функцию, которая возвращает поле переменной х длиной n битов, начинающиеся с позиции р и сдвинутое к правому краю.
unsigned getbits (unsigned x, unsigned p, unsigned n)
{
return((x >> (p+1-n)) & ~(~0 << n));
}
Операция x >> (p+1-n) сдвигает желаемое поле в правый конец слова. Все биты константного выражения ~0 равны 1; сдвиг его на n позиций влево с помощью операции ~0<<n создает маску с нулями в n крайних правых битах и единицами в остальных; дополнение ~ создает маску с единицами в n крайних правых битах.
Таким образом,
unsigned k, m=0xFFFF;
k = getbits(m, 4, 3);
возвращает в k сдвинутыми к правому краю биты, занимающие позиции 4,3 и 2 числа m. Т.е. k = = 7
