#include <iostream>
#include <iomanip>
#include <bitset>
#include <string>

// Функции для печати в шестнадцатеричном и двоичном формате с разделением байт
void print_in_hex(uint16_t value) {
    std::cout << std::hex << std::setw(2) << std::setfill('0') << (value >> 8);
    std::cout << ' ';
    std::cout << std::hex << std::setw(2) << std::setfill('0') << (value & 0xFF);
}

void print_in_binary(uint16_t value) {
    std::cout << std::bitset<8>(value >> 8) << ' ';
    std::cout << std::bitset<8>(value & 0xFF);
}

// Функция для выполнения побитовой операции
uint16_t calculate(uint16_t oper1, char operation, uint16_t oper2) {
    switch (operation) {
    case '&': return oper1 & oper2;
    case '|': return oper1 | oper2;
    case '^': return oper1 ^ oper2;
    default: throw std::invalid_argument("Invalid operation");
    }
}

int main() {
    uint16_t oper1, oper2;
    char operat;

    // Ввод данных
    std::cout << "Enter the first oper (uint16_t): ";
    std::cin >> oper1;

    std::cout << "Enter the operation (&, |, ^): ";
    std::cin >> operat;

    std::cout << "Enter the second oper (uint16_t): ";
    std::cin >> oper2;

    // Вычисление результата
    uint16_t res = calculate(oper1, operat, oper2);

    // Вывод результата в шестнадцатеричном формате
    std::cout << "Result in hexadecimal: ";
    print_in_hex(oper1);
    std::cout << " & ";
    print_in_hex(oper2);
    std::cout << " = ";
    print_in_hex(res);
    std::cout << std::endl;

    // Вывод результата в двоичном формате
    std::cout << "Result in binary: " << std::endl;
    print_in_binary(oper1);
    std::cout << " &" << std::endl;
    print_in_binary(oper2);
    std::cout << " =" << std::endl;
    print_in_binary(res);
    std::cout << std::endl;

    return 0;
}
