рубрики: Разное | Дата: 7 января, 2017
Рассмотрим преобразование из одной системы исчисления в другую.
В качестве примера рассмотрим преобразование из десятиричной системы исчисления
в двадцатишестиричную. Например, если по какой-то причине мы решили использовать
вместо цифр заглавные буквы латинского алфавита. На теоретической части преобразования
из одной системы исчисления в другую останавливаться не буду. Эту информацию найти
достаточно просто.
Приведу сразу код функций, которые можно разместить в общем модуле конфигурации 1С,
и использовать их для преобразований.
Функция СформироватьТаблицу_10_ABCD() Экспорт
ТаблицаСоответствия = Новый ТаблицаЗначений;
ТаблицаСоответствия.Колонки.Добавить("Значение_10");
ТаблицаСоответствия.Колонки.Добавить("Значение_ABCD");
Для Счетчик = 0 По 25 Цикл
НоваяСтрока = ТаблицаСоответствия.Добавить();
НоваяСтрока.Значение_10 = Счетчик;
НоваяСтрока.Значение_ABCD = Символ(Счетчик + 65);
КонецЦикла;
Возврат ТаблицаСоответствия;
КонецФункции
Функция Преобразовать_10_ABCD(ДесятичноеЧисло) Экспорт
Разрядность = 26;
СтрокаABCD = "";
ОстатокДеления = ДесятичноеЧисло;
ТаблицаСоответствия = СформироватьТаблицу_10_ABCD();
МассивСимволов = Новый Массив;
Пока ОстатокДеления > 0 ИЛИ МассивСимволов.Количество() = 0 Цикл
Остаток = Цел(ОстатокДеления / Разрядность);
Если Остаток = 0 Тогда
СтрокаСоответствия = ТаблицаСоответствия.Найти(ОстатокДеления);
МассивСимволов.Добавить(СтрокаСоответствия.Значение_ABCD);
ОстатокДеления = 0;
Иначе
СтрокаСоответствия = ТаблицаСоответствия.Найти(ОстатокДеления - Остаток * Разрядность);
МассивСимволов.Добавить(СтрокаСоответствия.Значение_ABCD);
ОстатокДеления = Остаток;
КонецЕсли;
КонецЦикла;
Для каждого Элемент Из МассивСимволов Цикл
СтрокаABCD = Элемент + СтрокаABCD;
КонецЦикла;
Возврат СтрокаABCD;
КонецФункции
Функция Преобразовать_ABCD_10(СтрокаЛатининца) Экспорт
Разрядность = 26;
ТекущаяСтрока = СокрЛП(СтрокаЛатининца);
ТаблицаСоответствия = СформироватьТаблицу_10_ABCD();
МассивСимволов = Новый Массив;
Пока ЗначениеЗаполнено(ТекущаяСтрока) Цикл
МассивСимволов.Добавить(Лев(ТекущаяСтрока, 1));
ТекущаяСтрока = Прав(ТекущаяСтрока, СтрДлина(ТекущаяСтрока) - 1);
КонецЦикла;
Степень = МассивСимволов.ВГраница();
ДесятичноеЧисло = 0;
Для каждого ЭлементМассива Из МассивСимволов Цикл
СтрокаСоответствия = ТаблицаСоответствия.Найти(ЭлементМассива);
Число = СтрокаСоответствия.Значение_10;
ДесятичноеЧисло = ДесятичноеЧисло + Число * pow(Разрядность, Степень);
Степень = Степень - 1;
КонецЦикла;
Возврат ДесятичноеЧисло;
КонецФункции
А теперь несколько комментариев.
Функция СформироватьТаблицу_10_ABCD() используется для формирования таблицы
соответствия между десятиричной и двадцатишестиричной системами и возвращает
таблицу значения вот такого вида:
Значение_10 | Значение_ABCD |
---|---|
0 | A |
1 | B |
2 | C |
3 | D |
… | … |
25 | Z |
Соответственно Функция Преобразовать_10_ABCD() используется для преобразования
из десятиричной в двадцатишестиричную систему, а Функция Преобразовать_ABCD_10()
наоборот из двадцатишестиричной в десятиричную.
В качестве примера попробуем преобразовать DCBA в десятиричную систему. Получаем
число 54106.
И небольшое лирическое отступление. Пока вникал во все эти преобразования и писал код,
произошел небольшой взрыв мозга сопровождающийся пониманием, что можно в принципе
сделать систему исчисления в цветах от красного до фиолетового или, например, в
зверушках от муравья до слона. Как вам такой примерчик: слон * муравья = муравей.
Или название числа — слонопотам.
Добавить комментарий