Примеры использования битовых операций приведены в табл. 4.3. Все переменные a, b, z этой таблицы типа unsignedchar. Язык Си не умеет работать с данными в двоичном формате, но для упрощения понимания работы каждое число представлено в двоичном формате (например, для первой строки a=20210=110010102, b=15510=100110112).
Таблица 4.3.
Операция | 1 операнд | 2 операнд | Результат | Комментарий |
НЕ | a=11001010 | b=10011011 | z=~a=00110101 z=~b=01100100 | Инвертируются все биты числа |
И | a=10011010 | b=11110000 | z=a&b=10010000 | На число a накладывается маска (число b) – выделяются значения 4 старших битов числа а, младшие биты обнуляются |
ИЛИ | a=10011010 | b=00001111 | z=a|b=10011111 | Четыре младших бита числа a устанавливаются в единичное состояние, старшие биты остаются без изменения |
Исключающее ИЛИ | a=10011010 | b=00001111 | z=a^b=10010101 | Старшие биты числа a остаются без изменения, младшие – инвертируются |
Сдвиг вправо | a=10011010 | b=00001111 | z=a<<1=00110100 z=b<<3=01111000 | Выполняется сдвиг вправо всех битов числа aна один разряд, числаb– на три разряда. Происходит потеря старших битов, установленных в «1» |
Сдвиг влево | a=10011010 | b=00001111 | z=a>>2=00100110 z=b>>1=00000111 | Выполняется сдвиг влево всех битов числа aна два разряда, числаb– на один разряд. Происходит потеря младших битов, установленных в «1» |
Следует отметить, что результатом исполнения битовой операции в отличии от логических операций будет число типа символ или целое, а не логические «0» или «1». Так, например, исполнение выражений b=a&&8 и b=a&8 при различных значениях переменной а даст такой результат:
Значение переменной а | Результат для b=a&&8 | Результат для b=a&8 |
0 | 0 | 0 |
8 | 1 | 8 |
16 | 0 | 0 |
255 | 0 | 8 |
4.7. Операции инкрементирования и декрементирования
Во всех языках программирования очень часто используются операции увеличения и уменьшения значения переменных на единицу – операции инкрементирования и декрементирования. В языке Си существуют две специальные формы записи: ++ и ––, например,
x++;
y--;
Операции
x=x+1; x+=1; x++;
идентичны друг другу. Различие состоит в том, что последний вариант записи исполняется быстрее.
Каждая из рассмотренных операций имеет две формы записи – префиксную и постфиксную, например, для переменной ‘x’ увеличение ее значения на единицу можно записать двумя способами: x++ или ++x. Разница в выполнении будет в случае использования инкремента в составе более сложных выражений, например, после выполнения операторов
x=10;
y=x++;
значение переменных будут следующие x=11, y=10 (постфиксная форма предполагает вначале использование значения переменной ‘x’, а затем увеличение его на единицу). Но после выполнения операторов
x=10;
y=++x;
значение переменных будут такие x=11, y=11 (префиксная форма предполагает вначале увеличение значения переменной ‘x’ на единицу, а затем его использование).
4.8. Операции вычисления размера объекта и преобразования типа данных
Часто требуется учитывать, сколько занимают те или иные переменные в памяти. Для этого используется оператор sizeof. Для этого оператора существует две формы записи: sizeof (<тип данных>) и sizeof (<выражение>). Результатом выполнения оператора будет целое число – размер в байтах занимаемый указанным типом данных или переменной.
4.8.1. Пример 4.3
Листинг 4.3
#include <stdio.h>
void main()
{
int a,b,c,d;
float x;
double y;
a=sizeof(char);
b=sizeof(unsigned long);
c=sizeof(x);
d=sizeof(y);
printf(“a=%d b=%d c=%d d=%d”,a,b,c,d);
}
Исполнением программы для версии языка ТС-2.0 будет следующий результат:
a=1 b=4 с=4 d=8
В предыдущем разделе уже рассматривалась операция преобразования типа. Для выполнения этой операции используются ключевые слова стандартных типов данных, взятые в круглые скобки. Например, при выполнении операторов
int x=2, y=5;
floatz;
z=y/x;
результатом является значение z=2. Для того чтобы получить точное значение отношения целых чисел ‘x’ и ‘y’ необходимо выполнить операцию преобразования типа
z=(float)y/x;
после этого будет z=2.5.