Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Си++ Занятие 3.doc
Скачиваний:
5
Добавлен:
12.11.2019
Размер:
118.78 Кб
Скачать

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. Операнд должен быть целого или вещественного типа, а может иметь также тип указатель. Поразрядное отрицание (~), часто называемое побитовым, инвертирует каждый разряд в двоичном представлении целочисленного операнда.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]