Рассмотрим перевод числа из шестнадцатеричной в двоичную систему счисления. Будут приведены: правило перевода и код программы на языке Си, выполняющей данное преобразование.
Теоретические сведения
Число в шестнадцатеричной системе счисления состоит из цифр: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F (где A, B, C, D, E и F равны 10, 11, 12, 13, 14 и 15 соответственно).
Например 5B09F3 — это число в шестнадцатеричной системе счисления.
Для перевода числа из шестнадцатеричной системы счисления в двоичную систему необходимо каждую цифру шестнадцатеричного числа заменить соответствующей ей тетрадой (4 бита) из таблицы перевода, приведенной ниже.
Приведем пример. Переведем число A50E7 в двоичную систему счисления. Для этого заменим каждую его цифру соответствующей ей тетрадой из таблицы перевода.
A50E7(16) = 10100101000011100111(2). Для удобочитаемости разные тетрады выделены разным начертанием шрифта.
Реализация программы
Напишем реализацию функции на языке программирования Си:
1 |
char* fromHEXtoBIN(long a, char *bin); |
, которая переводит число a, записанное в шестнадцатеричной системе счисления, в двоичную систему и заносит результат в массив символов bin.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
char* fromHEXtoBIN(long a, char *bin) { long tmp = a; int N; if (a == 0) N = 1; else { N = 0; while (tmp != 0) { N++; tmp = tmp / 16; } } bin = (char*)malloc((4 * N + 1)*sizeof(char)); for (int i = N - 1; i >= 0; i--) { switch (a % 16) { case 0: { bin[4 * i] = '0'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '0'; break; } case 1: { bin[4 * i] = '0'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '1'; break; } case 2: { bin[4 * i] = '0'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '0'; break; } case 3: { bin[4 * i] = '0'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '1'; break; } case 4: { bin[4 * i] = '0'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '0'; break; } case 5: { bin[4 * i] = '0'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '1'; break; } case 6: { bin[4 * i] = '0'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '0'; break; } case 7: { bin[4 * i] = '0'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '1'; break; } case 8: { bin[4 * i] = '1'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '0'; break; } case 9: { bin[4 * i] = '1'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '1'; break; } case 10: { bin[4 * i] = '1'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '0'; break; } case 11: { bin[4 * i] = '1'; bin[4 * i + 1] = '0'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '1'; break; } case 12: { bin[4 * i] = '1'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '0'; break; } case 13: { bin[4 * i] = '1'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '0'; bin[4 * i + 3] = '1'; break; } case 14: { bin[4 * i] = '1'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '0'; break; } case 15: { bin[4 * i] = '1'; bin[4 * i + 1] = '1'; bin[4 * i + 2] = '1'; bin[4 * i + 3] = '1'; break; } } a = a / 16; } bin[4 * N] = '\0'; return bin; } |
Функция fromHEXtoBIN принимает аргументы: число в шестнадцатеричной системе счисления и указатель на пустой массив типа char соответственно. fromHEXtoBIN возвращает указатель на массив, в котором хранится число в двоичной системе счисления.
В начале (строки 5-15) функция fromHEXtoBIN вычисляет количество цифр в числе a (число N). Затем (строка 16) выделяется необходимое количество памяти под двоичное представление числа, плюс один символ для нулевого символа — символа конца массива (‘\0’). После, начиная с конца числа a, для каждой его цифры выбирается соответствующая ей тетрада и заносится в массив bin (строки 17-151). Затем в конец массива добавляется нулевой символ (строка 152) и возвращается указатель на массив bin (строка 153).
Приведем пример консольной программы, использующей функцию fromHEXtoBIN, которая считывает число в шестнадцатеричной системе счисления, переводит его в двоичную систему и выводит результат на экран.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <stdio.h> #include <malloc.h> #include <conio.h> char* fromHEXtoBIN(long a, char *bin); int main() { long a = 0; scanf_s("%x", &a); char *bin = NULL; bin = fromHEXtoBIN(a, bin); int i = 0; while (bin[i] != '\0') printf("%c", bin[i++]); free(bin); _getch(); return 0; } |
Обратите внимание. В операторе scanf_s используется параметр %x. Он указывает, что число будет вводится в шестнадцатеричном представлении.
Не забываем очищать память, выделенную под массив bin (оператор free)!
Демонстрация работы программы приведена на рисунке ниже:
Существует еще один вариант решения поставленной задачи. В некоторых реализациях компилятора языка Си присутствует нестандартная функция itoa, описанная в заголовочном файле <stdlib.h>.
1 |
void* itoa(int input, char *buffer, int radix); |
Эта функция переводит число input в число с основанием системы счисления radix. Результат записывается в массив символов buffer.
В последних версиях компилятора C/C++ в Visual Studio функция itoa представлена следующим образом:
1 |
_itoa_s(int value, char *buffer, int sizeBuffer, int radix); |
В _itoa_s необходимо передавать указатель на массив buffer размером sizeBuffer под который уже выделена память. Число value будет переведено в систему счисления с основанием radix, а результат перевода будет сохранен в массив символов buffer.
Приведем код программы, переводящей число из шестнадцатеричной в двоичную систему счисления с помощью функции _itoa_s.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#include <stdio.h> #include <stdlib.h> #include <conio.h> int main() { long a = 0; scanf_s("%x", &a); char bin[100]; _itoa_s(a, bin, 100, 2); int i = 0; while (bin[i] != '\0') printf("%c", bin[i++]); _getch(); return 0; } |
Если вы хотите скачать исходники программ, приведенных в этой статье, то нажмите на кнопку.
Скачать исходники
Поделиться в соц. сетях: