Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
new_mb.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
892 Кб
Скачать
☆
      1. 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;

}

Сокращенная запись существует и для поразрядных операций: «>>=», «<<=», «|=», «&=» , «^=».

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