Структуры и поразрядные операции
В языке СИ есть возможность работать с отдельными разрядами (битами) байтов и слов. Операции с битами бывают необходимы в случае, если программист работает на уровне близком к машинному, что характерно для задач системного программирования. Каждый бит может принимать значения 0 или 1.
Поразрядные операции
Эти операции предназначены для изменения отдельных разрядов данных целых типов. Они используются для обработки двоичных кодов данных целых типов int (signed - со знаком и unsigned - без знака), а также символьных типов char и unsigned char. Поразрядные операции делятся на логические и сдвиговые операции.
Поразрядные логические операции с учетом их приоритетов (1– высший) представлены в табл. 1.
Таблица 1
Приоритет | Название операции | Символ операции |
НЕ (инверсия, отрицание) И (логическое умножение) ИЛИ исключающее (сложение по 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] |
Каждая из поразрядных операций служит определенным целям. Рассмотрим применение этих операций на примерах с однобайтовыми словами. Пусть, например, описаны переменные:
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 (код маски), тогда:
1) a = 01110001 б) a = 11110001
b = 10000000 b = 10000000
a ^ b = 11110001 a ^ b = 01110001
|
|
Сдвиговые поразрядные операции
Операции << (сдвиг влево) и >> (сдвиг вправо) являются бинарными и применяются только к операндам целого типа.
Результатом выражания вида