- •3.8. Упражнения 49
- •Введение
- •1. Базовые элементы
- •1.1. Комментарии
- •1.2. Функция «main»
- •1.3. Идентификаторы и пространства имен
- •1.4. Типы
- •1.5. Переменные
- •1.7. Константы
- •1.6. Преобразование типов
- •1.8. Потоковый ввод – вывод
- •1.9. Операции
- •1.9.1. Арифметические операции
- •1.9.2. Поразрядные операции
- •1.9.3. Условный оператор
- •1.9.4. Операции отношения
- •1.9.5. Логические операции
- •1.10. Стандартные математические функции
- •1.11. Упражнения
- •2. Базовые конструкции
- •2.1 Ветвление
- •2.1.1. Конструкция «if – else»
- •2.1.2. Конструкция «switch»
- •2.2. Циклы
- •2.2.1. Цикл «for»
- •2.2.2. Цикл «while»
- •2.2.3. Цикл «do – while»
- •2.2.4. Операторы циклов
- •2.2.5. Вложенность
- •2.3. Упражнения
- •2.3.1. Ветвления
- •2.3.2. Циклы
- •2.3.3. Вложенность
- •3. Указатели. Массивы. Структуры
- •3.1. Указатели
- •3.2. Массивы
- •3.2.1. Статические массивы
- •3.2.2. Динамические массивы
- •3.4. Ссылки
- •3.5. Структуры
- •3.6. Объединение
- •3.7. Переопределение типов
- •3.8. Упражнения
- •3.8.1. Статические и динамические массивы
- •3.8.2. Многомерные массивы
- •3.8.3. Строки
- •4. Функции
- •4.1. Простые функции
- •4.2. Рекурсия
- •4.3. Указатели и ссылки
- •4.3.1. Передаваемые параметры
- •4.3.2. Возвращаемые значения
- •4.3.3. Ссылки и структуры в функциях
- •4.3.4. Указатели и массивы в функциях
- •4.3.5. Указатели и ссылки на функцию
- •4.4. Шаблоны функций
- •4.5. Упражнения
- •4.5.1. Простые функции
- •4.5.2. Параметры – ссылки и параметры — указатели
- •5. Стандартные классы
- •5.1. Класс «pair»
- •5.2. Класс «complex»
- •5.3. Класс «string»
- •5.4. Контейнеры. Алгоритмы. Итераторы
- •5.5. Класс «vector»
- •5.6. Упражнения
- •5.6.1. Класс «string»
- •5.6.2. Класс «vector»
- •6. Файловый ввод – вывод
- •6.1. Операции
- •6.2. Методы
- •6.3. Флаги
- •6.4. Двоичный режим
- •6.5. Упражнения
- •Ллитература
1.9.2. Поразрядные операции
К поразрядным операциям относятся бинарные «&», «|», «^», «>>», «<<» и унарная «~». Следует отметить, что операция сдвига влево является, по сути, операцией умножения на число, равное двум в степени количества смещаемых бит, а сдвиг вправо – деление на аналогичное число. Данные операции выполняются быстрее арифметических, поэтому в приложениях, где важна скорость выполнения, могут их заменять, однако, не рекомендуется везде, где есть деление или умножение на число, кратное двум, использовать операции сдвига, т.к. это может усложнить восприятие кода.
Таблица 1.6. Поразрядные операции.
Знак |
Синтаксис |
Описание |
>> |
a >> b |
Поразрядный сдвиг a на b бит вправо |
<< |
a << b |
Поразрядный сдвиг a на b бит влево |
~ |
~a |
Поразрядное отрицание a |
& |
a & b |
Поразрядная конъюнкция над a и b |
| |
a | b |
Поразрядная дизъюнкция над a и b |
^ |
a ^ b |
Поразрядное XOR над a и b |
Листинг 1.9. Поразрядные операции.
#include <iostream>
using namespace std;
int main (void)
{
const unsigned int x = 5;
const unsigned int y = 3;
cout << "x = " << x << endl;
cout << "y = " << y << endl;
cout << "x&y = " << (x&y) << endl;
cout << "x|y = " << (x|y) << endl;
cout << "x^y = " << (x^y) << endl;
cout << "x&y ^ x|y = " << ((x&y) ^ (x|y)) << " = x^y" << endl;
cout << "x<<1 = " << (x << 1) << " = 2x" << endl;
cout << "y<<2 & x = " << ((y << 2) & x) << endl;
cout << "x+y >> 1 = " << (x+y>>1) << " = x+y / 2" << endl;
return 0;
}
В приведенном примере все поразрядные операции расположены внутри скобок. Это связано с тем, что иначе операторы сдвига будут интерпретироваться компилятором, как операторы вывода.
Следующий код демонстрирует различия между знаковым и беззнаковым типами на примере типа «short», а также саму интерпретацию знакового бита.
Листинг 1.10. Манипуляции со старшим битом знаковых и беззнаковых типов.
#include <iostream>
using namespace std;
int main (void)
{
short z;
z = 0x7FFF;
//максимальное число для short = 0х7FFF;
cout << "z :\t" << hex << z << " : " << dec << z << endl;
//вывод следующего за числом в z через сумму с 1;
cout << "z+1 :\t" << hex << z+1 << " : " << dec << z+1 << endl;
//вывод следующего за числом в z через его инкремент;
cout << "++z :\t" << hex << ++z << " :" << dec << z << endl;
//вывод следующего за числом в z с беззнаковым интерпретированием;
cout << "uz :\t" << hex << static_cast<unsigned short>(z) <<
" : " << dec << static_cast<unsigned short>(z) << endl << endl;
//перевод числа из положительного в отрицательное;
z = -105;
cout << "z :\t" << hex << z << " : " << dec << z << endl;
z = ~z;
z++;
cout << "z :\t" << hex << z << " : " << dec << z << endl << endl;
//перевод числа из отрицательного в положительное;
z = 501;
cout << "z :\t" << hex << z << " : " << dec << z << endl;
z--;
z = ~z;
cout << "z :\t" << hex << z << " : " << dec << z << endl << endl;
return 0;
}
Сокращенная запись существует и для поразрядных операций: «>>=», «<<=», «|=», «&=» , «^=».
