Очень часто в программах присутствуют операторы вида
a = a + b;
a = a - b;
a = a * b;
a = a / b;
Они изменяют значения некоторых переменных. В языке Cи для сокращения программ и повышения их эффективности используются дополнительные операторы присваивания:
a += b;
a -= b;
a *= b;
a /= b;
a %= b;
Дополнительные операции присваивания должны быть записаны слитно, без пробелов. Действие операции - изменение значения переменной, стоящей слева от знака операции. Результат - значение измененной переменной.
Дополнительные операции присваивания имеют самый низкий приоритет и выполняются справа налево.
Использование операций ++, --, +=, , , /=, %= вместо обычных не является обязательным, но их применение считается хорошим стилем программирования на языке Cи.
Любые данные, записанные в память ЭВМ, как известно, представляют собой последовательность бит, т.е. последовательность нулей и единиц. Например, любое число типа 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 в соответствующей степени.
Все битовые операции выполняются слева направо. В следующей строке приведены битовые операции в порядке уменьшения их приоритета.
~, << >>, &, ^, |
Для двуместных битовых операций определены дополнительные операции присваивания: