Вы не можете выбрать более 25 тем
Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
120 строки
3.1 KiB
C++
120 строки
3.1 KiB
C++
#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;
|
|
}
|