Результаты битовых операций
Битовые операции
Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит, т.е. последовательность нулей и единиц. Например, любое число типа int будет занимать 2 байта в памяти, т.е 16 бит. Его можно рассматривать двояко: либо как целое число (так и делается при выполнении операций *,/, +, -, %), либо как последовательность бит, что возможно при использовании битовых операций.
Битовые операции выполняются независимо над каждым битом данных. Если операция двуместная, то она выполняется над соответствующими битами операндов.
В Си имеются следующие битовые операции:
~ битовое отрицание (одноместная),
& побитовое "и" (двуместная),
^ побитовое "исключающие или" (двуместная),
| побитовое "или" (двуместная).
Результат этих операций определяет таблица значений для всевозможных комбинаций бит двух операндов.
op1 | op2 | ~op1 | op1 & op2 | op1 ^ op2 | op1 | op2 |
Рассмотрим несколько примеров.
|
|
Первый пример показывает, как с помощью операции | можно установить в единицу выбранные биты операнда:
/* a = 00001001 = 9 */
char a, b; /* 00011010 = 26 */
a = 9; /* -------- */
b = a | 26 /* b = 31 */ /* b = 00011011 = 31 */
Следующий пример показывает, как с помощью операции & можно обнулить старшую часть байта:
char a, b; /* a = 00101101 = 45 */
a = 45; /* 00001111 */
b = a & 0x0F; /* -------- */
/* b = 00001101 = 13 */
К битовым операциям относятся операции сдвига << и >>:
a << b сдвиг битов переменной a влево на b позиций,
a >> b сдвиг битов переменной a вправо на b позиций.
Например:
char a, b;
a = 26; /* a = 00011010 = 26 */
b = a << 2; /* b = 01101000 = 104 */
Сдвиг влево равносилен умножению на 2 в соответствующей степени. Сдвиг вправо - делению на 2 в соответствующей степени.
Все битовые операции выполняются слева направо. В следующей строке приведены битовые операции в порядке уменьшения их приоритета.
~, << >>, &, ^, |
Для двуместных битовых операций определены дополнительные операции присваивания:
a <<= b; эквивалентно a = a << b,
a >>= b; эквивалентно a = a >> b,
a &= b; эквивалентно a = a & b,
a ^= b; эквивалентно a = a ^ b,
a |= b; эквивалентно a = a | b.
Представляют собой двуместные операции, предназначенные для сравнения операндов. В языке Си имеются шесть операций отношения:
> больше,
< меньше,
>= больше или равно,
<= меньше или равно,
== равно,
!= не равно.
Действие операций отношения заключается в сравнении первого и второго операнда. Если операнды не удовлетворяют условию отношения, то результат операции равен нулю, т.е. условие ложно. Если операнды удовлетворяют условию отношения, то результат отношения не равен нулю, т.е. условие истинно.
|
|
Например:
int a,b;
a = 5;
b = (a + 5 <= 4); /* b = 0 */
Из сказанного выше следует, что в языке Cи отсутствует специальный логический тип данных. Его заменяет целый тип, причем логическому понятию "ложно" соответствует значение 0, а логическому понятию "истина" - любое отличное от 0 целое число.
Операции отношения выполняются слева направо. При нечетком понимании их действия возможно получение, вообще говоря, неверного результата. Например, с точки зрения синтаксиса языка Си выражение a<x<b записано совершенно правильно, но действия, выполняемые в соответствии с ним будут отличаться от принятых в математике: сначала будет вычислено выражение a<x, которое даст результат 0 или 1, а затем этот результат будет сравниваться с b.
Чтобы это выражение соответствовало математическому смыслу, его нужно разбить на две части a < x и x < b и связать его логической операцией && ("и"), т.е. (a < x) && (x < b). Такая запись читается так: если a меньше x и x меньше b, то результат - истина.