Введение.
Совсем недавно я обнаружил, что многим нелегко даётся понимание шестнадцатеричной и двоичной систем исчисления. Поэтому этот FAQ я посвящу им. Начнём с простого. Все мы знаем десятичную систему исчисления, так как обычно только с ней и сталкиваешься. Возьмём число 1234.
Степень 10 | 3 | 2 | 1 | 0 |
цифра | 1 | 2 | 3 | 4 |
Таблица №1 |
Число 1234 это ничто иное как 1
∙10
3+2
∙10
2+3
∙10
1+4
∙10
0=1234
Таким образом цифры составляют десятичное число. Если с этим всё понятно, тогда с помощью алгебры можно записать в общем виде уравнение числа любой системы исчисления.
Допустим, A-число состоит из n цифр системы исчисления D, тогда его можно записать так: А=аn∙Dn-1+аn-1∙Dn-2+ʌ+а2∙D1+а1∙D0 (Ур.1), где a - цифры этого числа.
Теперь о системах исчисления по подробнее.
Двоичная система.
Система исчисления с числом цифр 2: 0 и 1 (D=2). В компьютере информация кодируется двумя состояниями: сигналами пассивного уровня или активного уровня, т.е. 0 или 1. Поэтому эта система исчисления и была разработана. Теперь применим уравнение 1 к двоичной системе и получим число 1001.
Если это понятно, то как нам перейти от 10 системы к двоичной? Нужно делить последовательно на два.
10 | 2 | | | | | | | | |
10 | 5 | 2 | | | | | | | |
0 | 4 | 2 | 2 | | | | | | |
| | 1 | 2 | 1 | | | | | | |
| | | | 0 | | | | | | | | |
\/ | \/ | \/ | \/ | | | | | | |
0 | 1 | 0 | 1 | | | | | | |
<-- | --- | --- | --- | | | | | | |
| | | | | | | | | |
| | | | | | | | | |
Стрелкой показан порядок записи цифр остатков от деления на 2. Наше число 10 десятичное это ничто иное, как 1010 двоичное. Далее, чтобы не было разночтений, я буду писать 1010, где нижний индекс основание системы исчисления.
Шестнадцатеричная система.
D=16. Пожалуй, с ней исследователю РОМов приходится сталкиваться очень часто. Как вы уже заметили, двоичная система исчисления очень неудобна для записи. Чтобы написать число 1010 надо 4 двоичных цифры. А 8 цифр дают всего лишь 25510. Поэтому было решено перейти для записи к системе кратной двоичной: шестнадцатеричной. Цифры этой системы: 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F.
Применяя уравнение 1, можно записать число 1F16
15∙161+15∙160=15+16=31
1F16=3110
Преобразование из 10 к 16, всё то же деление на D=16
31 | 16 |
16 | 1 |
15 | 4 |
| | 1 |
| | | |
\/ | \/ |
F | 1 |
<--- | --- |
Записываем остатки в обратном порядке и получаем 1F (естественно заменяя 15 на F).
Восьмеричная система исчисления.
D=8 утратила свое значение, уступив место 16-ричной системе исчисления. Но она всё также преподаётся в университетах и школах. Все то же самое, что и для 16.
Применяя уравнение 1, можно записать число 2468 как:
2∙82+4∙81+6∙80=128+32+6=166
2468=16610
Преобразование из 10 к 8, всё то же деление на D=8
166 | 8 | |
160 | 20 | 8 |
6 | 16 | 2 |
| | 4 | | |
| | | | | |
\/ | \/ | \/ |
6 | 4 | 2 |
<-- | -- | -- |
Записываем остатки в обратном порядке, получаем 246.
Преобразование двоичной системы к 16, 8-ричной и обратно.
10 | 16 | 2 |
0 | 0 | 0000 |
1 | 1 | 0001 |
2 | 2 | 0010 |
3 | 3 | 0011 |
4 | 4 | 0100 |
5 | 5 | 0101 |
6 | 6 | 0110 |
7 | 7 | 0111 |
8 | 8 | 1000 |
9 | 9 | 1001 |
10 | A | 1010 |
11 | B | 1011 |
12 | C | 1100 |
13 | D | 1101 |
14 | E | 1110 |
15 | F | 1111 |
Таблица №2 |
На практике такое часто нужно. Как это сделать? Нужно просто заменить двоичные цифры
Имеем 2-ичное число 1010001 дополняем спереди его нулями, чтобы количество цифр было кратно 4: 0101 0001, и заменяем полученные тетрады по таблице.
Получаем 5116=10100012 .
Теперь с 8-миричной системой всё то же самое, только заменяем не тетрады, а триады.
Подчёркнутый 0 не учитывать. 11100 дополняем нулями спереди чтобы число цифр было кратно 3. и заменяем по таблице 2: 011 1002=348 .
Легко заметить, что обратное преобразованием ничем ни отличается.
Допустим 1F16=0001 11112. Или 248=010 1002
Всё очень просто, не правда ли?
Дроби.
Как дело обстоит с дробями? Описанный формат дроби не соответствует его представлению в памяти персонального компьютера, но изучается в университетах, для базиса знаний. Чтобы перейти потом к сложному. Итак, помните таблицу 1?
А что с десятичной дробью? Оказывается всё просто: 1234,12
Степень 10 | 3 | 2 | 1 | 0 | -1 | -2 |
цифра | 1 | 2 | 3 | 4 | 1 | 2 |
Таблица №3 |
1∙103+2∙102+3∙101+4∙100+1∙10-1+2∙10-2=1234,12
Уравнение 1 примет вид.
А-целое, B-дробное.Число=C=A+B
А=аn∙Dn-1+аn-1∙Dn-2+ʌ+а2∙D1+а1∙D0 для целой части
И для дробной части.
B=b1∙D-1+b2∙D-2+ʌ+b2∙D-(k-1)+bk∙D-k
Для преобразования дроби в двоичную систему исчисления необходимо умножать её на два. Возьмем число 8,12.
810=10002
0,12x2=0,24 нет ничего в целой части пишем в дробь 0,0
0,24x2=0,48 нет ничего в целой части пишем в дробь 0,00
0,48x2=0,96 нет ничего в целой части пишем в дробь 0,000
0,96x2=1,92 в целой части 1 пишем в дробь 0,0001
Отбрасываем целое и продолжаем
0,92х2= И так пока не выйдем на заданный предел точности, ну а я решил остановиться.
Выходит что 8,1210~1000.00012
С шестадцатиричными числами всё также, только умножаем на 16. Если есть в целой части число, пишем в дробь его, если нет, то пишем 0.
Чтобы сократить число умножений при преобразовании 10-тичной дроби в 2-ичную, вначале её приводят к шестнадцатеричной записи, а потом переводят её в двоичную по методу, описанному выше заменой на тетрады по таблице.
Пример :
Число 0,62510
0,625x16=10 10о в целой части пишем в дробь 0,A
Теперь преобразуем двоичную по таблице 0,10102. (A=1010)
Проверим: 2-1+2-3=0,5+0,125=0,625
Как видите и с дробями ничего сложного. Если кого-либо заинтриговала тема, пишите. Возможно FAQ получит развитие. С уважением, Шеф (chief_exb).