Задание 2. Битовый калькулятор

master
NazarovKO 4 месяцев назад
Родитель 2a456a2992
Сommit 4cdb71aae1

@ -0,0 +1,119 @@
#include <iostream>
#include <locale>
#include <iomanip>
using namespace std;
// Ìàññèâ ñèìâîëîâ äëÿ hex
const char hex_chars[] = "0123456789ABCDEF";
// Ôóíêöèÿ äëÿ ïðåîáðàçîâàíèÿ äàííûõ â áàéòû
const uint8_t* to_bytes(const void* data) {
return reinterpret_cast<const uint8_t*>(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;
}
Загрузка…
Отмена
Сохранить