#include using namespace std; char digits[] = "0123456789ABCDEF"; const uint8_t* as_bytes(const void* data) { return reinterpret_cast(data); } char nibble_to_hex(uint8_t i) { return digits[i & 0xf]; } void print_in_hex(uint8_t byte) { cout << nibble_to_hex(byte >> 4) << nibble_to_hex(byte & 0xf); } void print_in_hex(const void* data, size_t size) { const uint8_t *bytes = as_bytes(data); for (size_t i = 0; i < size; i++) { print_in_hex(bytes[i]); if ((i + 1) % 16 == 0) { cout << '\n'; } else { cout << ' '; } } } char bit_digit(uint8_t byte, uint8_t bit) { if (byte &(0x1 << bit)) { return '1'; } return '0'; } void print_in_binary(uint8_t byte) { for (int bit = 7; bit >= 0; bit--) { cout << bit_digit(byte, bit); } } void print_in_binary(const void* data, size_t size) { const uint8_t *bytes = as_bytes(data); for (size_t i = 0; i < size; i++) { print_in_binary(bytes[i]); if ((i + 1) % 4 == 0) { cout << '\n'; } else { cout << ' '; } } } int main() { uint16_t c1, c2, result = 0; char operation[8]; bool calculated = false; cout << "Input expression: "; cin >> c1 >> operation >> c2; switch (operation[0]) { case '&': result = c1&c2; calculated = true; break; case '|': result = c1 | c2; calculated = true; break; case '^': result = c1 ^ c2; calculated = true; break; default: cout << "Unknown operation\n"; break; } if (calculated) { print_in_hex(&c1, sizeof(uint16_t)); cout << " & "; print_in_hex(&c2, sizeof(uint16_t)); cout << " = "; print_in_hex(&result, sizeof(uint16_t)); cout << "\n"; print_in_binary(&c1, sizeof(uint16_t)); cout << " &\n"; print_in_binary(&c2, sizeof(uint16_t)); cout << " =\n"; print_in_binary(&result, sizeof(uint16_t)); cout << "\n"; } cin >> result; }