Поразрядные операции

Последнее обновление: 20.02.2023
Упражнение 1

Напишите программу, которая считывает с консоли три символа и упаковывает их в одно число. Выведите полученное число на консоль. Затем распакуйте число - получите обратно упакованные символы из числа в отдельные переменные.

Решение
#include <iostream>

int main()
{
    unsigned int packed {};     // переменная, которая хранит упакованное число
    unsigned char ch {};        // переменная для считывания символа
    std::cout <<  "Enter a first character: ";
    std::cin >> ch;             // считываем первый символ
    packed |= ch;               // помещаем первый символ в число 

    std::cout << "Enter a second character: ";
    std::cin >> ch;         // считываем второй символ
    packed <<= 8;           // сдвиг влево на 1 байт - предоставляем место для второго символа
    packed |= ch;           // помещаем второй символ в число

    std::cout << "Enter a third character: ";
    std::cin >> ch;           // считываем третий символ
    packed <<= 8;             // сдвиг влево на 1 байт - предоставляем место для третьего символа
    packed |= ch;             // помещаем третий символ в число

    // выводим число на консоль
    std::cout << packed << std::endl;
    
    // распаковка идет в обратном порядке - сначала извлекается третий - последний добавленный символ
    unsigned int mask {0xFF};  // маска для считывания - 0xFF - максимальное значение символа

    ch = packed & mask;         // применяем маску - выбираем крайний правый байт - третий символ
    std::cout << ch;
    ch = (packed >> 8) & mask;  // сдвигаем на 1 байт вправо и снова получаем правый байт - второй символ
    std::cout << ch;
    ch = (packed >> 16) & mask;  // сдвигаем на 2 байта вправо и получаем правый байт - первый символ
    std::cout << ch  << std::endl;
}

Пример работы программы:

Enter a first character: e
Enter a second character: u
Enter a third character: g
6649191
gue
Упражнение 2

Одна из форм определения цвета представляет запись в формате RGB, где R, G и B - соответственно компоненты красного, зеленого и синего цвета. Каждая компонента может иметь значение от 0 до 255. Например, число 0xffffff в шестнадцатеричном формате представляет цвет, где все три компоненты равны FF16 или 25510 в десятичной системе. Напишите программу, которая считывает с консоли значения для трех компонент цвета и сохраняет их в числовую переменную color.

Решение
#include <iostream>

int main()
{
    unsigned int color {};     // переменная, которая хранит цвет
    unsigned int c {};        // переменная для считывания цветовой компоненты
    std::cout <<  "Red: ";
    std::cin >> c;             // считываем значение красного цвета
    color |= c;               

    std::cout << "Green: ";
    std::cin >> c;         //считываем значение красного цвета
    color <<= 8;           
    color |= c;           

    std::cout << "Blue: ";
    std::cin >> c;           // считываем третий символ
    color <<= 8;             // сдвиг влево на 1 байт - предоставляем место для третьего символа
    color |= c;             // помещаем третий символ в число

    // выводим числовое значение цвета на консоль
    std::cout << color << std::endl;
}

Пример работы программы:

Red: 15
Green: 14
Blue: 255
986879
Упражнение 3

Одна из форм определения цвета представляет запись в формате RGB, где R, G и B - соответственно компоненты красного, зеленого и синего цвета. Каждая компонента может иметь значение от 0 до 255. Например, число 0x04F1aA216 в шестнадцатеричном формате представляет цвет, где красная компонента равна 04, зеленая - F1 и синяя - A2

Пусть дана переменная

unsigned int color {0x04F1A2u};     // переменная, которая хранит цвет

Напишите программу, которая извлекает из этой переменной все три цветовых компоненты в отдельные переменные.

Решение
#include <iostream> 

int main()
{
    unsigned int color {0x04F1A2u};     // переменная, которая хранит цвет
    unsigned int mask {0xFFu};          // маска для получения цветовых компонент

    // получаем значение красного цвета
    unsigned int red {(color >> 16) & mask};
    // получаем значение зеленого цвета
    unsigned int green {(color >> 8) & mask};
    // получаем значение синего цвета
    unsigned int blue {color & mask};

    std::cout << "Red: " << red << std::endl;     
    std::cout << "Green: " << green << std::endl;    
    std::cout << "Blue: " << blue << std::endl;

    // с помощью std::hex можно получить шестнадцатиричное значение
    std::cout << "red: " << std::hex << red << std::endl;
    std::cout << "green: " << std::hex << green << std::endl;
    std::cout << "blue: " << std::hex << blue << std::endl;
}

Консольный вывод:

Red: 4
Green: 241
Blue: 162

red: 4
green: f1
blue: a2
Упражнение 4

Даны следующие переменные:

int a {8};
int b {11}; 

Напишите программу, которая обменивает значения переменных a и b без использования третьей переменной. Используйте для этого одну из поразрядных операций.

Решение
#include <iostream> 

int main()
{
    int a {8};      // 1000
    int b {11};     // 1011
    a = a ^ b;      // 1000 ^ 1011 = 0011
    b = a ^ b;      // 0011 ^ 1011 = 1000
    a = a ^ b;      // 0011 ^ 1000 = 1011
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
}

Консольный вывод:

a = 11
b = 8
Дополнительные материалы
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850