- •Занятие 3 Выражения. Переменные. Операции.
- •1. Переменные
- •2. Операции
- •2.1 Операция присваивания
- •2.2 Бинарные арифметические операции
- •2.4 Неявное преобразование типов
- •2.5 Логические операции и операции отношения
- •2.6 Поразрядные (побитовые) операции
- •2.7 Операции сдвига
- •2.8 Операция sizeof
- •2.10 Операция следования
- •2.11 Условная операция (?:)
- •3. Выражения
2.6 Поразрядные (побитовые) операции
Как известно, на машинном уровне вся информация представлена в виде 0 и 1, но обычно для того, чтобы выполнять вычисления, программисту не обязательно знать это представление, языки высокого уровня берут на себя эту рутинную работу, и позволяют программисту оперировать данными в привычной для себя форме.
Однако некоторые задачи требуют понимания происходящих на машинном уровне процессов обработки информации. Например, управление оборудованием (клавиатурой или принтером) заключается в анализе и изменении отдельных битов регистра управления, в этом случае необходимо использовать побитовые операции.
Побитовые операции используются для анализа и изменения отдельных битов числа и применяются только к переменным целого типа: int, char и их вариантам. Побитовые операции нельзя применять к переменным типа float, double, void, а также к более сложным типам данных.
Отдельные биты переменной можно рассматривать как логические значения, т.к. они могут принимать лишь два значения 0 или 1, которые в С рассматривают как FALSE или TRUE.
К побитовым операциям относятся
~ отрицание (инверсия)
& логическое И
| логическое ИЛИ
^ исключающее ИЛИ (отрицание равенства).
Поразрядные операции применяются только к целочисленным операндам и работают с их двоичными представлениями. При выполнении операций операнды сопоставляются побитово (первый бит первого операнда с первым битом второго, второй бит первого операнда со вторым битом второго и т.д.).
При поразрядной конъюнкции, или поразрядном И бит результата равен 1 только тогда, когда соответствующие биты обоих операндов равны 1.
При поразрядной дизъюнкции, или поразрядном ИЛИ бит результата равен 1 тогда, когда соответствующий бит хотя бы одного из операндов равен 1.
При поразрядном исключающем ИЛИ бит результата равен 1 только тогда, когда соответствующий бит только одного из операндов равен 1.
Пример.
#include <iostream.h>
int main()
{
cout << "\n 6&5 =" << (6&5);
cout << "\n 6|5 =" << (6|5);
cout << "\n 6^5 =" << (6^5);
return 0;
}
Результат работы программы:
6&5 = 4;
6 | 5 = 7;
6 ^ 5 = 3.
2.7 Операции сдвига
Операции сдвига также оперируют с отдельными битами переменной и являются бинарными операторами. В первом операнде находится информация, которую необходимо сдвигать, во втором размещается параметр – число сдвигов. Оба операнда должны быть целыми величинами.
Существуют две операции сдвига:
<< - сдвиг влево
>> - сдвиг вправо.
При сдвиге влево правые освобождающиеся биты устанавливаются в 0.
При сдвиге вправо метод заполнения освобождающихся левых битов зависит от типа правого операнда. Если тип unsigned, то свободные левые биты устанавливаются в 0. В противном случае они заполняются копией знакового бита.
2.8 Операция sizeof
Операция определения размера sizeof предназначена для вычисления размера объекта или типа в байтах, и имеет две формы:
sizeof выражение
sizeof (тип)
Пример.
#include <iostream.h>
int main()
{
float x=1;
cout << " sizeof (float):" << sizeof (float);
cout << "\n sizeof x:" << sizeof x;
cout << "\n sizeof (x+1.0):" << sizeof (x+1.0);
return 0;
}
Результат работы программы:
sizeof (float): 4
sizeof x: 4
sizeof (x+1.0): 8
Последний результат связан с тем, что вещественные константы по умолчанию имеют тип double, к которому, как к более длинному, приводится тип переменной х и всего выражения. Скобки необходимы для того чтобы выражение, стоящее в них, вычислялось раньше операции приведения типа, имеющей больший приоритет, чем сложение.
2.9 Операции отрицания (-, !, ~)
Арифметическое отрицание (унарный минус) изменяет знак операнда целого или вещественного типа на противоположный. Логическое отрицание (!) дает в результате значение 0, если операнд есть истина, и значение 1, если операнд равен 0. Операнд должен быть целого или вещественного типа, а может иметь также тип указатель. Поразрядное отрицание (~), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении целочисленного операнда.