diff --git a/lab04_2.cpp b/lab04_2.cpp new file mode 100644 index 0000000..cc765e1 --- /dev/null +++ b/lab04_2.cpp @@ -0,0 +1,119 @@ +#include +#include +#include +using namespace std; + +// Массив символов для hex +const char hex_chars[] = "0123456789ABCDEF"; + +// Функция для преобразования данных в байты +const uint8_t* to_bytes(const void* data) { + return reinterpret_cast(data); +} + +// Функция для преобразования полубайта в hex символ +char half_byte_to_hex(uint8_t i) { + return hex_chars[i & 0xf]; +} + +// Функция для печати байта в hex формате +void print_hex(uint8_t byte) { + cout << half_byte_to_hex(byte >> 4) + << half_byte_to_hex(byte & 0xf); +} + +// Функция для печати данных в hex формате +void print_hex(const void* data, size_t size) { + const uint8_t *bytes = to_bytes(data); + for (size_t i = 0; i < size; i++) { + print_hex(bytes[i]); + if ((i + 1) % 16 == 0) { + cout << '\n'; + } else { + cout << ' '; + } + } +} + +// Функция для получения бита из байта +char get_bit(uint8_t byte, uint8_t bit) { + return (byte & (0x1 << bit)) ? '1' : '0'; +} + +// Функция для печати байта в binary формате +void print_binary(uint8_t byte) { + for (int bit = 7; bit >= 0; bit--) { + cout << get_bit(byte, bit); + } +} + +// Функция для печати данных в binary формате +void print_binary(const void* data, size_t size) { + const uint8_t *bytes = to_bytes(data); + for (size_t i = 0; i < size; i++) { + print_binary(bytes[i]); + if ((i + 1) % 4 == 0) { + cout << '\n'; + } else { + cout << ' '; + } + } +} + +// Функция для вывода результатов в виде таблички +void print_results_table(uint16_t num1, uint16_t num2, uint16_t result, const char* operation) { + cout << "| Операнд 1 (HEX) | Операнд 2 (HEX) | Результат (HEX) |\n"; + cout << "|-----------------|-----------------|-----------------|\n"; + cout << "| "; + print_hex(&num1, sizeof(uint16_t)); + cout << " | "; + print_hex(&num2, sizeof(uint16_t)); + cout << " | "; + print_hex(&result, sizeof(uint16_t)); + cout << " |\n\n"; + + cout << "| Операнд 1 (BIN) | Операнд 2 (BIN) | Результат (BIN) |\n"; + cout << "|-----------------|-----------------|-----------------|\n"; + cout << "| "; + print_binary(&num1, sizeof(uint16_t)); + cout << " | "; + print_binary(&num2, sizeof(uint16_t)); + cout << " | "; + print_binary(&result, sizeof(uint16_t)); + cout << " |\n"; +} + +int main() { + setlocale(LC_ALL, "Russian"); + uint16_t num1, num2, result = 0; + char operation[8]; + bool is_calculated = false; + + cout << "Введите выражение: "; + cin >> num1 >> operation >> num2; + + switch (operation[0]) { + case '&': + result = num1 & num2; + is_calculated = true; + break; + case '|': + result = num1 | num2; + is_calculated = true; + break; + case '^': + result = num1 ^ num2; + is_calculated = true; + break; + default: + cout << "Неизвестная операция\n"; + break; + } + + if (is_calculated) { + print_results_table(num1, num2, result, operation); + } + + cin >> result; + return 0; +}