Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прилож В2 Описание языка С ч 2.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
382.46 Кб
Скачать

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