#include <iostream>
#include <iomanip>
#include <cstdint>
#include <bitset>
#include <sstream>
#include <regex>

using namespace std;

// Функция для печати числа типа uint16_t в шестнадцатеричном и двоичном виде
string number_to_string(uint16_t num) {
    ostringstream oss;
    oss << setfill('0') << setw(2) << hex << static_cast<uint8_t>(num >> 8) << ' '
        << setfill('0') << setw(2) << hex << static_cast<uint8_t>(num);
    string hex_str = oss.str();
    oss.str("");
    oss << bitset<8>(num >> 8) << ' ' << bitset<8>(static_cast<uint8_t>(num));
    string bin_str = oss.str();
    return hex_str + " " + bin_str;
}

int main() {
    uint16_t num1, num2; // Два операнда
    char op; // Оператор
    // Ввод выражения в формате "num1 op num2"
    cin >> dec >> num1 >> op >> num2;

    uint16_t result; // Результат операции

    // Выполнение операции в зависимости от введенного оператора
    switch (op) {
        case '&':
            result = num1 & num2;
            break;
        case '|':
            result = num1 | num2;
            break;
        case '^':
            result = num1 ^ num2;
            break;
        default:
            cout << "Unknown operator\n";
            return 1;
    }

    // Формирование строки вывода
    string output = number_to_string(num1) + " & " + number_to_string(num2) +
                    " = " + number_to_string(result);

    // Замена "&" на соответствующий оператор
    if (op == '|') {
        output = regex_replace(output, regex("&"), "|");
    } else if (op == '^') {
        output = regex_replace(output, regex("&"), "^");
    }

    // Печать результата
    cout << output << '\n';

    return 0;
}