Допустим, у нас есть число 247, которое мы хотим перевести в двойчный, восьмеричный и шестнадцатиричный коды...
Сначала переведем в шестнадцатиричный (так, вроде, проще).
Для этого делим данное число на 16. Целая часть идет во второй порядок, остаток от деления -- в первый. В данном случае, в псевдокоде:
N = 247;
H1 = N / 16; // 15 === 0xF
H2 = N % 16; // 7 === 0x7
далее остается перевести в нужную нотацию:
char int_to_hex(unsigned int num) {
static const char hex_values[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
if(num > 15) return -1;
return hex_values[num];
}
Перевод из шестнадцатиричной в бинарный -- тривиально.
15 / 8 = 1 (7 - ост.)
7 / 4 = 1 (3 - ост.)
3 / 2 = 1 (1 - ост.)
1 / 1 = 1 (0 - ост.)
--------------
1111
7 / 8 = 0 (7 - ост.)
7 / 4 = 1 (3 - ост.)
3 / 2 = 1 (1 - ост.)
1 / 1 = 1 (0 - ост.)
--------------
0111
Быстрее и эффективнее, однако, будет создать таблицу и делать поиск по ней:
char hex_values[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
short bin_values[16] = {0, 1, 10, 11, 100, 101, 110, 111, 1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111}; // в десятичной "нотации"
short oct_values[16] = {0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15, 16, 17}; // --""--
Тогда *_values[N] даст тебе одно из представлений данного числа N (от 0 до 15). Это быстрее, так как в языке С обращение к элементу массива -- всего лишь обращение по адресу в памяти, что не затрагивает никаких арифметических вычислений.
Обычно все это не нужно, так как стандартные библиотеки предоставляют функции делающие такие преобразования. Вывод числа в шестнадцатиричном, восьмеричном или бинарном формате в С производится функциями семейства *printf(). В C++ (STL) используются т.н. "манипуляторы" ввода-вывода (std::hex, std::bin, std::oct, std::dec).
Сообщение изменено: tomatensaft (02 октября 2004 - 02:17 )