Профессия — 1С

Рукопашный бой Карташ

Категории

Преобразование из одной системы исчисления в другую

рубрики: Разное | Дата: 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.

И небольшое лирическое отступление. Пока вникал во все эти преобразования и писал код,
произошел небольшой взрыв мозга сопровождающийся пониманием, что можно в принципе
сделать систему исчисления в цветах от красного до фиолетового или, например, в
зверушках от муравья до слона. Как вам такой примерчик: слон * муравья = муравей.
Или название числа — слонопотам.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

   

2018г. Профессия — 1С. Обмен опытом по программированию в 1С