Когда я разбирал быстрый и точный перевод из десятичной системы в двоичную с использованием разрядов, я обещал, что напишу, как быстро переводить без десятичной системы между двоичной, восьмеричной, шестнадцатиричной системами (часто те, кто хорошо знает метод "деления уголком", переводят сначала в десятичную, а потом в нужную новую). И вот эта статья перед Вами. В ней я не только дам этот метод (он и так валяется везде в интернете), но и опишу его принцип и объясню, почему перевод 2<->8 работает, а 2<->10 или 8<->16 - нет. Как обычно, самое интересное - в конце.
Поехали
Метод
Очень простой: заменяем цифры в записи справа налево в соответствии с нужной таблицей:
Теперь всё очень просто, как это - туда, а то - сюда: в 16-ричной системе каждая цифра будет заменена на 4 двоичных и наоборот - каждые 4 двоичных цифры будут заменяться на одну 16-ричную.
Если требуется перевести из 8-ричной в 16-ричную, то перевод осуществляем через двоичную (8->2->16).
Пример: 7F21 из 16-ричной в двоичную. "1" заменим на "0001" , "2" - на "0010", "F" - на "1111" и "7" - на "0111": "(0111)(1111)(0010)(0001)". Лидирующий (левый) ноль стираем: 111111100100001. Профит. Можно так же быстро в восьмеричную: (111)(111)(100)(100)(001)-77441_8
Теперь -
Как это устроено
Всё дело в волшебных... разрядах. Разряды идут:
Смотрите, они одинаковые. В четверичной используется каждый второй двоичный разряд, в восьмеричной - каждый третий, а в 16-ричной - каждый четвёртый. Для разбора, как это работает я возьму пример перевода из 8й системы в двоичную. Сделаем заготовку для двоичной:
Теперь можно просто "перенести" цифры:
Запись получилась не двоичная, но так и должно быть. Посмотрите, в двоичной системе ни один разряд не может браться 2,3,4 и более раз, а у нас 64 берётся 7 раз. Вспомним болты, гайки и шайбы, которые разменивались друг на друга пачками. Пусть у нас болт стоит 256, гайка - 128, а шайба - 64 с порогом размена по 2 (двоичная же система) . Имеем по факту 7 шайб. 7 шайб можно разменять на 3 гайки и одна шайба останется (каждую гайку за 2 шайбы):
Та же участь ждёт гайки. Из трёх гаек можно взять 2 и разменять на 1 болт:
Теперь надо так же разменять "4". Четыре "восьмёрки" (шайбы) разменяется ровнёхонько на один по "32" (болт)
В те разряды, которые не задействованы, ставим 0.
Из этого примера видно, почему в восьмеричной системе используются группы по три цифры - один восьмеричный разряд прекрасно разменивается на три двоичных. В общем-то, понятно, что при переводе 2-4 и 4-2 будут группы по две цифры, потому что в четверичной системе каждый второй двоичный разряд
Техника перевода будет работать и в других парах систем счисления, где разряды совпадают. Тут важно, чтобы каждый разряд старшей системы обязательно встречался среди разрядов младшей. Например, троичная-девятиричная:
Напрямую можно переводить и между четверичной и 16-ричной. А вот десятичная тут ущербная. Её разряды не встречаются ни в одной другой "практически полезной" системе: ...-1000-100-10-1. Здесь есть корреляция с простыми делителями (не даром есть метод "деления уголком") оснований систем счисления. У чисел 4, 8, 16 и т.д. делитель только один - двойка. Поэтому и разряды в них только из двоичной системы. Для девятки делитель тоже только один - тройка. А вот у десятки сразу два простых делителя. Это 5 и 2. Значит, у "сродной" системы к десятичной будут делители основания 25 и 4 (квадраты), а это только 100-ричная.
Напоследок
Подарю пример перевода между системами 2->10 с помощью "деления уголком". Не из десятичной в двоичную, а наоборот. Метод настолько универсальный, что работает даже там. Делим уголком 111001001 на 1010 (в двоичной системе так записывается основание "нашей" десятичной системы) и записываем остатки в обратном порядке:
Вдруг, кому пригодится деление в двоичной системе. Я хотел сначала в девятиричную перевести (надо было делить на 1001), но это неспециалисту проверить труднее.