Слайд 2Поразрядные операторы
Применяются для работы с булевыми векторами.
Булев вектор – набор 0
![Поразрядные операторы Применяются для работы с булевыми векторами. Булев вектор – набор](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-1.jpg)
и 1, который представляет собой набор признаков (каждый разряд – признак). 1 – признак присутствует, 0 – признак отсутствует.
Поразрядные операторы воздействуют на отдельные двоичные разряды (биты) своих операндов. Они определены только для целочисленных операндов, поэтому их нельзя применять к данным типа bool, float или double.
Слайд 4Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ
Поразрядные операторы И, ИЛИ, исключающее
![Поразрядные операторы И, ИЛИ, исключающее ИЛИ и НЕ Поразрядные операторы И, ИЛИ,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-3.jpg)
ИЛИ и НЕ обозначаются следующим образом: &, |, ^ и ~. Они выполняют те же функции, что и их логические аналоги.
Но в отличие от логических операторов, поразрядные операторы действуют на уровне отдельных двоичных разрядов.
Слайд 5Поразрядную операцию И
Поразрядную операцию И можно рассматривать как способ подавления отдельных двоичных
![Поразрядную операцию И Поразрядную операцию И можно рассматривать как способ подавления отдельных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-4.jpg)
разрядов. Это означает, что если какой-нибудь бит в любом из операндов равен 0, то соответствующий бит результата будет сброшен в 0.
Слайд 6Поразрядный оператор ИЛИ
Поразрядный оператор ИЛИ может быть использован для установки отдельных двоичных
![Поразрядный оператор ИЛИ Поразрядный оператор ИЛИ может быть использован для установки отдельных](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-5.jpg)
разрядов. Если в 1 установлен какой-нибудь бит в любом из операндов этого оператора, то в 1 будет установлен и соответствующий бит результата.
Слайд 7Поразрядный оператор
исключающее ИЛИ
Поразрядный оператор исключающее ИЛИ устанавливает двоичный разряд операнда в
![Поразрядный оператор исключающее ИЛИ Поразрядный оператор исключающее ИЛИ устанавливает двоичный разряд операнда](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-6.jpg)
том и только в том случае, если двоичные разряды сравниваемых операндов оказываются разными, как в приведенном ниже примере.
Слайд 9Пример программного кода
// Метод, проверяющий является ли число четным
void provChet(int x)
![Пример программного кода // Метод, проверяющий является ли число четным void provChet(int](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-8.jpg)
{
for (int i = 1; i <= x; i++)
{ if ((i & 1) == 0)
cout<<"Число“< else
cout<<"Число“<}
Слайд 10Еще пример
// Метод, преобразующий четные числа в нечетные
// с помощью поразрядного
![Еще пример // Метод, преобразующий четные числа в нечетные // с помощью](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-9.jpg)
оператора |
void nechet(int x)
{ int result;
for (int i = 0; i <= x; i++)
{ result = i | 1;
printf(“%d “, result);}
}
Слайд 11Операторы сдвига
В С имеется возможность сдвигать двоичные разряды, составляющие целое значение, влево
![Операторы сдвига В С имеется возможность сдвигать двоичные разряды, составляющие целое значение,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-10.jpg)
или вправо на заданную величину. Ниже приведена общая форма для этих операторов:
значение << число_битов
значение >> число_битов
где число_битов — это число двоичных разрядов, на которое сдвигается указанное значение.
Слайд 12Сдвиг влево
При сдвиге влево на 1 все двоичные разряды в указываемом значении
![Сдвиг влево При сдвиге влево на 1 все двоичные разряды в указываемом](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-11.jpg)
сдвигаются на одну позицию влево, а младший разряд сбрасывается в нуль.
Пример.
10111011 << 5 = 01100000.
Слайд 13Сдвиг вправо беззнакового числа
При сдвиге вправо на 1 все двоичные разряды в
![Сдвиг вправо беззнакового числа При сдвиге вправо на 1 все двоичные разряды](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-12.jpg)
указываемом значении сдвигаются на одну позицию вправо.
Если вправо сдвигается целое значение без знака, то старший разряд сбрасывается в нуль.
Пример.
10111011 >> 1 = 01011101.
Слайд 14Сдвиг вправо знакового числа
Если вправо сдвигается целое значение со знаком, то разряд
![Сдвиг вправо знакового числа Если вправо сдвигается целое значение со знаком, то](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-13.jpg)
знака сохраняется.
Для представления отрицательных чисел старший разряд целого числа устанавливается в 1.
Если сдвигаемое значение является отрицательным, то при каждом сдвиге вправо старший разряд числа устанавливается в 1.
Пример.
10111011 >> 1 = 11011101.
Если сдвигаемое значение является положительным, то при каждом сдвиге вправо старший разряд числа сбрасывается в нуль.
Пример.
00111011 >> 1 =00011101.
Слайд 15При сдвиге влево и вправо крайние двоичные разряды теряются. Восстановить потерянные при
![При сдвиге влево и вправо крайние двоичные разряды теряются. Восстановить потерянные при](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-14.jpg)
сдвиге двоичные разряды нельзя, поскольку сдвиг в данном случае не является циклическим.
Слайд 16Short int n = 6, result;
// Умножить на 2
result =
![Short int n = 6, result; // Умножить на 2 result =](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-15.jpg)
(int)(n << 1);
// Умножить на 4
result = (int)(n << 2);
// Разделить на 2
result = (int)(n >> 1);
Слайд 17Работа с булевыми векторами
Когда работаем с данными как с булевым вектором, нужно
![Работа с булевыми векторами Когда работаем с данными как с булевым вектором,](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-16.jpg)
описывать их беззнаковым типом.
unsigned int x;
Слайд 18Примеры
Установить 1 в i-м разряде булева вектора а
а = а|(1<Удалить 0 в
![Примеры Установить 1 в i-м разряде булева вектора а а = а|(1](/_ipx/f_webp&q_80&fit_contain&s_1440x1080/imagesDir/jpg/1021961/slide-17.jpg)
i-м разряде булева вектора а
а = ~(1<Проверить – есть ли 1 в i-ом разряде
if ((1<