<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=997565</guid>
        <pubDate>Thu, 26 Jan 2006 21:16:07 +0000</pubDate>
        <title>Конвертация из одной СИ в другую</title>
        <link>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=997565</link>
        <description><![CDATA[Zoobastik: Переписал, вроде нигде не напортачил. Пойдет? :angry: <br>
<br>
Использование: пример конвертирования числа ABC01, записанного в 16-ти ричной СИ в 8-ричную<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">Convert(&#39;ABC01&#39;,&#39;0123456789ABCDEF&#39;,&#39;01234567&#39;)</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// Модуль для работы с натуральными числами в различных системах исчисления</div><div class="code_line">&nbsp;</div><div class="code_line">// Далее, если говорится, что Система Исчисления (СИ) задается строкой (CharSet)</div><div class="code_line">// то имеется в виду, что эта строка содержит символы требуемой СИ, начиная с нуля</div><div class="code_line">// Примеры CharSet (стандартный вид)</div><div class="code_line">// Двоичная &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- &#39;01&#39;</div><div class="code_line">// Восьмиричная &nbsp; &nbsp; &nbsp;- &#39;01234567&#39;</div><div class="code_line">// Десятичная &nbsp; &nbsp; &nbsp; &nbsp;- &#39;0123456789&#39;</div><div class="code_line">// Шестнадцатиричная - &#39;0123456789ABCDEF&#39;</div><div class="code_line">// Можно использовать и нестандартные виды, например для двоичной &#39;ab&#39;, а для</div><div class="code_line">// троичной &#39;abc&#39; - данному модулю все равно.</div><div class="code_line">&nbsp;</div><div class="code_line">// &quot;-Ричность&quot; СИ ограничена только наличием доступных различных символов.</div><div class="code_line">// Работа с числами в определенной СИ производится как со строками, потому величина</div><div class="code_line">// чисел значения почти не имеет, но это отрицательно сказывается на времени работы</div><div class="code_line">// функций (особенно на умножении).</div><div class="code_line">unit MyUnit;</div><div class="code_line">&nbsp;</div><div class="code_line">interface</div><div class="code_line">&nbsp;</div><div class="code_line">function Convert(Num, SetIn, SetOut: String): String;</div><div class="code_line">function MySum (Num1, Num2, CharSet: String): String;</div><div class="code_line">function MyMulti (Num1, Num2, CharSet: String): String;</div><div class="code_line">function MyOrd(A: Char; CharSet: String): Integer;</div><div class="code_line">function MyChr(Num: Integer; CharSet: String): Char;</div><div class="code_line">&nbsp;</div><div class="code_line">implementation</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция возвращает позицию символа A в строке CharSet (начиная с 0)</div><div class="code_line">function MyOrd(A: Char; CharSet: String): Integer;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := 0;</div><div class="code_line">&nbsp;&nbsp;for i := 1 to Length(CharSet) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;if CharSet[i] = A then begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Result := i-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp;end</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция возвращает символ из строки CharSet по номеру Num (~CharSet[Num+1])</div><div class="code_line">function MyChr(Num: Integer; CharSet: String): Char;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := CharSet[Num mod Length(CharSet) + 1];</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция возвращает число без ведущих нулей, то есть ShortNum(&#39;0000123&#39;)=&#39;123&#39;</div><div class="code_line">function ShortNum(Num, CharSet: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;k, j: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;Result := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;k := 1;</div><div class="code_line">&nbsp;&nbsp;while Num[k] = MyChr(0, CharSet) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;k := k + 1;</div><div class="code_line">&nbsp;&nbsp;for j := k to Length(Num) do Result := Result + Num[j];</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция выполняет сложение двух чисел Num1 и Num2 в СИ, задаваемой CharSet</div><div class="code_line">function MySum (Num1, Num2, CharSet: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, Pos, Add, L, L_CharSet: Integer;</div><div class="code_line">&nbsp;&nbsp;N1 , N2 , O, Res: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Далее потребуется что бы первое число по длине было не менее второго,</div><div class="code_line">&nbsp;&nbsp;// если не так, то меняем местами</div><div class="code_line">&nbsp;&nbsp;if Length(Num1)&#62;=Length(Num2) then</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;N1 := Num1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;N2 := Num2;</div><div class="code_line">&nbsp;&nbsp;end</div><div class="code_line">&nbsp;&nbsp;else</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;N1 := Num2;</div><div class="code_line">&nbsp;&nbsp; &nbsp;N2 := Num1;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;L:= Length(N1);</div><div class="code_line">&nbsp;&nbsp;L_CharSet := Length(CharSet);</div><div class="code_line">&nbsp;&nbsp;O:=MyChr(0, CharSet); // 0 - в СИ, определяемой CharSet</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//Уравнняем второе до длины первого нулями справа: 10 = 010</div><div class="code_line">&nbsp;&nbsp;for i := Length(N2) to L-1 do</div><div class="code_line">&nbsp;&nbsp; &nbsp;N2 := O + N2;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Add:=0;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//Суммирование с младших разрядов, Add - добавка от предыдущих разрядов</div><div class="code_line">&nbsp;&nbsp;// для следующего. Напр. для 10-чной СИ: 9+7 - Add = 1, 4+5 - Add=0</div><div class="code_line">&nbsp;&nbsp;for i := L downto 1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Pos := MyOrd(N1[i], CharSet)+MyOrd(N2[i], CharSet) + Add;</div><div class="code_line">&nbsp;&nbsp; &nbsp;Add := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;while Pos &#62;= L_CharSet do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Pos := Pos mod L_CharSet;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Add := Add + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Res := MyChr(Pos, CharSet) + Res;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">If Add&#60;&#62;0</div><div class="code_line">&nbsp;&nbsp; then Result := MyChr(Add, CharSet) + Res</div><div class="code_line">&nbsp;&nbsp; else Result := Res;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция выполняет умножение двух чисел Num1 и Num2 в СИ, задаваемой CharSet</div><div class="code_line">function MyMulti (Num1, Num2, CharSet: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, e, Res, N1, N2: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;N1 := ShortNum(Num1, CharSet);</div><div class="code_line">&nbsp;&nbsp;N2 := ShortNum(Num2, CharSet);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;i :=&#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;Res := &#39;&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//e - единица СИ, определяемая CharSet</div><div class="code_line">&nbsp;&nbsp;e := MyChr(1,CharSet);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;//Умножение Num1 на Num2 - это Num1 сложеное Num2 раз в СИ, определяемой CharSet</div><div class="code_line">&nbsp;&nbsp;while (i &#60;&#62; N2) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Res := MySum(Res, N1, CharSet);</div><div class="code_line">&nbsp;&nbsp; &nbsp;i := MySum(i, e, CharSet);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result := Res;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция выполняет преобразование одноразрядного числа A, заданного</div><div class="code_line">// в СИ, определяемой SetIn, в число в СИ, определяемой SetOut</div><div class="code_line">function f0(A: Char; SetIn, SetOut: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Pos, j, L: Integer;</div><div class="code_line">&nbsp;&nbsp;Res: String;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;L := Length(SetOut);</div><div class="code_line">&nbsp;&nbsp;Pos := MyOrd(A, SetIn);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;for j := 1 To Pos div (L-1) do</div><div class="code_line">&nbsp;&nbsp; &nbsp;Res := MySum(Res, MyChr(L-1, SetOut), SetOut);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result := MySum(Res, MyChr(Pos mod (L-1), SetOut), SetOut);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">// Функция выполняет преобразование числа Num, заданного</div><div class="code_line">// в СИ, определяемой SetIn, в число в СИ, определяемой SetOut</div><div class="code_line">function Convert(Num, SetIn, SetOut: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Base, Multiplier, N, Res: String;</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp;// Num = MultilplierN * Base^N + ... + Multiplier0 * Base^0</div><div class="code_line">&nbsp;&nbsp;// Base - основание СИ, это всегда &#60;последний символ CharSet&#62;+&#60;нулевой символ&#62; ~ 10</div><div class="code_line">&nbsp;&nbsp;// MultiplierI - множитель при соответствующей степени</div><div class="code_line">&nbsp;&nbsp;// Напр. для 10-чной СИ &nbsp;- &nbsp;123 = 1 * 10^2 + 2 * 10^1 + 3 * 10^0</div><div class="code_line">&nbsp;&nbsp;// Тут Base = 10, Multiplier = {1, 2, 3}</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Base := MySum(f0(MyChr(Length(SetIn)-1, SetIn), SetIn, SetOut), MyChr(1, SetOut), SetOut);</div><div class="code_line">&nbsp;&nbsp;N := MyChr(1, SetOut); // = Base^0, потом будем домножать на Base (в соотв. СИ)</div><div class="code_line">&nbsp;&nbsp;Res := &#39;&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;// Обрабатываем входящее число с хвоста</div><div class="code_line">&nbsp;&nbsp;for i := Length(Num) downto 1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;Multiplier := f0(Num[i], SetIn, SetOut);</div><div class="code_line">&nbsp;&nbsp; &nbsp;Res := MySum(Res, MyMulti(Multiplier, N, SetOut), SetOut);</div><div class="code_line">&nbsp;&nbsp; &nbsp;N := MyMulti(Base, N, SetOut);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Result := Res;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">end.</div></ol></div></div></div></div>]]></description>
        <author>Zoobastik</author>
        <category>Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=996825</guid>
        <pubDate>Thu, 26 Jan 2006 09:46:11 +0000</pubDate>
        <title>Конвертация из одной СИ в другую</title>
        <link>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=996825</link>
        <description><![CDATA[Smike: <div class='tag-quote'><span class='tag-quote-prefix'>Цитата</span> <div class='quote '><div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, Pos, Add, L, L_CharSet: Integer;</div><div class="code_line">&nbsp;&nbsp;AA,BB, O, Res: String;</div><div class="code_line">begin</div><div class="code_line">if Length(A)&#62;=Length(B)</div><div class="code_line">&nbsp;&nbsp; then begin AA:=A; BB:=B; end</div><div class="code_line">&nbsp;&nbsp; else begin AA:=B; BB:=A; end;</div></ol></div></div></div></div></div></div><br>
Кошмар, это код не для FAQ. Что за AA, BB? Тут даже комментариями в коде не обойдешься. Нужно называть переменные нормально. Советую почитать <a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=97856' target='_blank'>эту тему</a>.<br>
<br>
Насчет кода S6T6N6. Написано не очень качественно. Некоторые функции можно было бы написать более эффективно. Нет комментариев, а код большой и содержит много сходу непонятных преобразований.<br>
<br>
В общем, вот образец:<br>
<a class='tag-url' href='http://forum.sources.ru/index.php?showtopic=100271' target='_blank'>Перевод чисел из десятичной</a>]]></description>
        <author>Smike</author>
        <category>Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=995171</guid>
        <pubDate>Tue, 24 Jan 2006 18:18:56 +0000</pubDate>
        <title>Конвертация из одной СИ в другую</title>
        <link>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=995171</link>
        <description><![CDATA[S6T6N6: <div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">&quot;Перевод между системами исчисления&quot;</div><div class="code_line">-----------------------------------------------------------------------</div><div class="code_line">Полнофункциональный готовый модуль с расширенными возможностями.</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">UNIT CONVUNIT;</div><div class="code_line">INTERFACE</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION DEC2BIN(DEC: LONGINT): STRING;</div><div class="code_line">FUNCTION BIN2DEC(BIN: STRING): LONGINT;</div><div class="code_line">FUNCTION DEC2HEX(DEC: LONGINT): STRING;</div><div class="code_line">FUNCTION HEX2DEC(HEX: STRING): LONGINT;</div><div class="code_line">FUNCTION DEC2OCT(DEC: LONGINT): STRING;</div><div class="code_line">FUNCTION OCT2DEC(OCT: STRING): LONGINT;</div><div class="code_line">FUNCTION BIN2HEX(BIN: STRING): STRING;</div><div class="code_line">FUNCTION HEX2BIN(HEX: STRING): STRING;</div><div class="code_line">FUNCTION DEC2BASEN(BASE: INTEGER; DEC: LONGINT): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION BASEN2DEC(BASE: INTEGER; NUM: STRING): LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">IMPLEMENTATION</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION DEC2BIN(DEC: LONGINT): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;BIN : STRING;</div><div class="code_line">&nbsp;&nbsp;I, J: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;IF DEC = 0 THEN BIN := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;BIN := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;I := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WHILE (1 SHL (I + 1)) &#60;=DEC DO I := I + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ (1 SHL (I + 1)) = 2^(I + 1) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOR J := 0 TO I DO</div><div class="code_line">&nbsp;&nbsp; &nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;IF (DEC SHR (I - J)) = 1 THEN BIN := BIN + &#39;1&#39;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ (DEC SHR (I - J)) = DEC DIV 2^(I - J) }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;ELSE BIN := BIN + &#39;0&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DEC := DEC AND ((1 SHL (I - J)) - 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ DEC AND ((1 SHL (I - J)) - 1) = DEC MOD 2^(I - J) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;END;</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;DEC2BIN := BIN;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION BIN2DEC(BIN: STRING): LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;J &nbsp; &nbsp;: LONGINT;</div><div class="code_line">&nbsp;&nbsp;Error: BOOLEAN;</div><div class="code_line">&nbsp;&nbsp;DEC &nbsp;: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;DEC := 0;</div><div class="code_line">&nbsp;&nbsp;Error := False;</div><div class="code_line">&nbsp;&nbsp;FOR J := 1 TO Length(BIN) DO</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;IF (BIN[J] &#60;&#62;&#39;0&#39;) AND (BIN[J] &#60;&#62;&#39;1&#39;) THEN Error := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;IF BIN[J] = &#39;1&#39; THEN DEC := DEC + (1 SHL (Length(BIN) - J));</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ (1 SHL (Length(BIN) - J)) = 2^(Length(BIN)- J) }</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;IF Error THEN BIN2DEC := 0</div><div class="code_line">&nbsp;&nbsp;ELSE BIN2DEC := DEC;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION DEC2HEX(DEC: LONGINT): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;HEXDigts: STRING[16] = &#39;0123456789ABCDEF&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;HEX : STRING;</div><div class="code_line">&nbsp;&nbsp;I, J: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;IF DEC = 0 THEN HEX := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;HEX := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;I := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WHILE (1 SHL ((I + 1) * 4)) &#60;=DEC DO I := I + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ 16^N = 2^(N * 4) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ (1 SHL ((I + 1) * 4)) = 16^(I + 1) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOR J := 0 TO I DO</div><div class="code_line">&nbsp;&nbsp; &nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;HEX := HEX + HEXDigts[(DEC SHR ((I - J) * 4)) + 1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ (DEC SHR ((I - J) * 4)) = DEC DIV 16^(I - J) }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DEC := DEC AND ((1 SHL ((I - J) * 4)) - 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ DEC AND ((1 SHL ((I - J) * 4)) - 1) = DEC MOD 16^(I - J) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;END;</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;DEC2HEX := HEX;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION HEX2DEC(HEX: STRING): LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION Digt(Ch: CHAR): BYTE;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;HEXDigts: STRING[16] = &#39;0123456789ABCDEF&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;I: BYTE;</div><div class="code_line">&nbsp;&nbsp;N: BYTE;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;N := 0;</div><div class="code_line">&nbsp;&nbsp;FOR I := 1 TO Length(HEXDigts) DO</div><div class="code_line">&nbsp;&nbsp;IF Ch = HEXDigts[I] THEN N := I - 1;</div><div class="code_line">&nbsp;&nbsp;Digt := N;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;HEXSet: SET OF CHAR = [&#39;0&#39;..&#39;9&#39;, &#39;A&#39;..&#39;F&#39;];</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;J &nbsp; &nbsp;: LONGINT;</div><div class="code_line">&nbsp;&nbsp;Error: BOOLEAN;</div><div class="code_line">&nbsp;&nbsp;DEC &nbsp;: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;DEC := 0;</div><div class="code_line">&nbsp;&nbsp;Error := False;</div><div class="code_line">&nbsp;&nbsp;FOR J := 1 TO Length(HEX) DO</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;IF NOT (UpCase(HEX[J]) IN HEXSet) THEN Error := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DEC := DEC + Digt(UpCase(HEX[J])) SHL ((Length(HEX) - J) * 4);</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ 16^N = 2^(N * 4) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ N SHL ((Length(HEX) - J) * 4) = N * 16^(Length(HEX) - J) }</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;IF Error THEN HEX2DEC := 0</div><div class="code_line">&nbsp;&nbsp;ELSE HEX2DEC := DEC;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION DEC2OCT(DEC: LONGINT): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;OCTDigts: STRING[8] = &#39;01234567&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;OCT : STRING;</div><div class="code_line">&nbsp;&nbsp;I, J: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;IF DEC = 0 THEN OCT := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;OCT := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;I := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WHILE (1 SHL ((I + 1) * 3)) &#60;=DEC DO I := I + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ 8^N = 2^(N * 3) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ (1 SHL (I + 1)) = 8^(I + 1) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOR J := 0 TO I DO</div><div class="code_line">&nbsp;&nbsp; &nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;OCT := OCT + OCTDigts[(DEC SHR ((I - J) * 3)) + 1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ (DEC SHR ((I - J) * 3)) = DEC DIV 8^(I - J) }</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DEC := DEC AND ((1 SHL ((I - J) * 3)) - 1);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;{ DEC AND ((1 SHL ((I - J) * 3)) - 1) = DEC MOD 8^(I - J) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;END;</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;DEC2OCT := OCT;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION OCT2DEC(OCT: STRING): LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;OCTSet: SET OF CHAR = [&#39;0&#39;..&#39;7&#39;];</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;J &nbsp; &nbsp;: LONGINT;</div><div class="code_line">&nbsp;&nbsp;Error: BOOLEAN;</div><div class="code_line">&nbsp;&nbsp;DEC &nbsp;: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;DEC := 0;</div><div class="code_line">&nbsp;&nbsp;Error := False;</div><div class="code_line">&nbsp;&nbsp;FOR J := 1 TO Length(OCT) DO</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;IF NOT (UpCase(OCT[J]) IN OCTSet) THEN Error := True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DEC := DEC + (Ord(OCT[J]) - 48) SHL ((Length(OCT) - J) * 3);</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ 8^N = 2^(N * 3) }</div><div class="code_line">&nbsp;&nbsp; &nbsp;{ N SHL ((Length(OCT) - J) * 3) = N * 8^(Length(OCT) - J) }</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;IF Error THEN OCT2DEC := 0</div><div class="code_line">&nbsp;&nbsp;ELSE OCT2DEC := DEC;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION BIN2HEX(BIN: STRING): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION SetHex(St: STRING; VAR Error: BOOLEAN): CHAR;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;Ch: CHAR;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; IF St = &#39;0000&#39; THEN Ch := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0001&#39; THEN Ch := &#39;1&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0010&#39; THEN Ch := &#39;2&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0011&#39; THEN Ch := &#39;3&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0100&#39; THEN Ch := &#39;4&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0101&#39; THEN Ch := &#39;5&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0110&#39; THEN Ch := &#39;6&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;0111&#39; THEN Ch := &#39;7&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1000&#39; THEN Ch := &#39;8&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1001&#39; THEN Ch := &#39;9&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1010&#39; THEN Ch := &#39;A&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1011&#39; THEN Ch := &#39;B&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1100&#39; THEN Ch := &#39;C&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1101&#39; THEN Ch := &#39;D&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1110&#39; THEN Ch := &#39;E&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE IF St = &#39;1111&#39; THEN Ch := &#39;F&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE Error := True;</div><div class="code_line">&nbsp;&nbsp;SetHex := Ch;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;HEX &nbsp;: STRING;</div><div class="code_line">&nbsp;&nbsp;I &nbsp; &nbsp;: INTEGER;</div><div class="code_line">&nbsp;&nbsp;Temp : STRING[4];</div><div class="code_line">&nbsp;&nbsp;Error: BOOLEAN;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;Error := False;</div><div class="code_line">&nbsp;&nbsp;IF BIN = &#39;0&#39; THEN HEX := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;Temp := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;HEX := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;IF Length(BIN) MOD 4 &#60;&#62;0 THEN</div><div class="code_line">&nbsp;&nbsp; &nbsp;REPEAT</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;BIN := &#39;0&#39; + BIN;</div><div class="code_line">&nbsp;&nbsp; &nbsp;UNTIL Length(BIN) MOD 4 = 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOR I := 1 TO Length(BIN) DO</div><div class="code_line">&nbsp;&nbsp; &nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;Temp := Temp + BIN[I];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;IF Length(Temp) = 4 THEN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;HEX := HEX + SetHex(Temp, Error);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Temp := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;END;</div><div class="code_line">&nbsp;&nbsp; &nbsp;END;</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;IF Error THEN BIN2HEX := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE BIN2HEX := HEX;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION HEX2BIN(HEX: STRING): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;BIN &nbsp;: STRING;</div><div class="code_line">&nbsp;&nbsp;I &nbsp; &nbsp;: INTEGER;</div><div class="code_line">&nbsp;&nbsp;Error: BOOLEAN;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;Error := False;</div><div class="code_line">&nbsp;&nbsp;BIN := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp;FOR I := 1 TO Length(HEX) DO</div><div class="code_line">&nbsp;&nbsp;CASE UpCase(HEX[I]) OF</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;0&#39;: BIN := BIN + &#39;0000&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;1&#39;: BIN := BIN + &#39;0001&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;2&#39;: BIN := BIN + &#39;0010&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;3&#39;: BIN := BIN + &#39;0011&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;4&#39;: BIN := BIN + &#39;0100&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;5&#39;: BIN := BIN + &#39;0101&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;6&#39;: BIN := BIN + &#39;0110&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;7&#39;: BIN := BIN + &#39;0111&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;8&#39;: BIN := BIN + &#39;1000&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;9&#39;: BIN := BIN + &#39;1001&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;A&#39;: BIN := BIN + &#39;1010&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;A&#39;: BIN := BIN + &#39;1011&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;C&#39;: BIN := BIN + &#39;1100&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;D&#39;: BIN := BIN + &#39;1101&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;E&#39;: BIN := BIN + &#39;1110&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;&#39;F&#39;: BIN := BIN + &#39;1111&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;ELSE Error := True;</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;IF Error THEN HEX2BIN := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE HEX2BIN := BIN;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION Potens(X, E :LONGINT): LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;P, I : LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;P := 1;</div><div class="code_line">&nbsp;&nbsp;IF E = 0 THEN P := 1</div><div class="code_line">&nbsp;&nbsp;ELSE FOR I := 1 TO E DO P := P * X;</div><div class="code_line">&nbsp;&nbsp;Potens := P;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION DEC2BASEN(BASE: INTEGER; DEC: LONGINT): STRING;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;NUMString: STRING = &#39;0123456789ABCDEFGHAIJKLMNOPQRSTUVWXYZ&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;NUM : STRING;</div><div class="code_line">&nbsp;&nbsp;I, J: INTEGER;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;IF (DEC = 0) OR (BASE &#60;2) OR (BASE &#62;36) THEN NUM := &#39;0&#39;</div><div class="code_line">&nbsp;&nbsp;ELSE</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;NUM := &#39;&#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp;I := 0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;WHILE Potens(BASE, I + 1) &#60;=DEC DO I := I + 1;</div><div class="code_line">&nbsp;&nbsp; &nbsp;FOR J := 0 TO I DO</div><div class="code_line">&nbsp;&nbsp; &nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;NUM := NUM + NUMString[(DEC DIV Potens(BASE, I - J)) + 1];</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;DEC := DEC MOD Potens(BASE, I - J);</div><div class="code_line">&nbsp;&nbsp; &nbsp;END;</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;DEC2BASEN := NUM;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION BASEN2DEC(BASE: INTEGER; NUM: STRING): LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">FUNCTION Digt(Ch: CHAR): BYTE;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;NUMString: STRING = &#39;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;I: BYTE;</div><div class="code_line">&nbsp;&nbsp;N: BYTE;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;N := 0;</div><div class="code_line">&nbsp;&nbsp;FOR I := 1 TO Length(NUMString) DO</div><div class="code_line">&nbsp;&nbsp;IF Ch = NUMString[I] THEN N := I - 1;</div><div class="code_line">&nbsp;&nbsp;Digt := N;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">CONST</div><div class="code_line">&nbsp;&nbsp;NUMSet: SET OF CHAR = [&#39;0&#39;..&#39;9&#39;, &#39;A&#39;..&#39;Z&#39;];</div><div class="code_line">&nbsp;</div><div class="code_line">VAR</div><div class="code_line">&nbsp;&nbsp;J &nbsp; &nbsp;: INTEGER;</div><div class="code_line">&nbsp;&nbsp;Error: BOOLEAN;</div><div class="code_line">&nbsp;&nbsp;DEC &nbsp;: LONGINT;</div><div class="code_line">&nbsp;</div><div class="code_line">BEGIN</div><div class="code_line">&nbsp;&nbsp;DEC := 0;</div><div class="code_line">&nbsp;&nbsp;Error := False;</div><div class="code_line">&nbsp;&nbsp;IF (BASE &#60;2) OR (BASE &#62;36) THEN Error := True;</div><div class="code_line">&nbsp;&nbsp;FOR J := 1 TO Length(NUM) DO</div><div class="code_line">&nbsp;&nbsp;BEGIN</div><div class="code_line">&nbsp;&nbsp; &nbsp;IF (NOT (UpCase(NUM[J]) IN NUMSet)) OR (BASE &#60;Digt(NUM[J]) + 1) THEN Error</div><div class="code_line">:= True;</div><div class="code_line">&nbsp;&nbsp; &nbsp;DEC := DEC + Digt(UpCase(NUM[J])) * Potens(BASE, Length(NUM) - J);</div><div class="code_line">&nbsp;&nbsp;END;</div><div class="code_line">&nbsp;&nbsp;IF Error THEN BASEN2DEC := 0</div><div class="code_line">&nbsp;&nbsp;ELSE BASEN2DEC := DEC;</div><div class="code_line">END;</div><div class="code_line">&nbsp;</div><div class="code_line">END.</div></ol></div></div></div></div>]]></description>
        <author>S6T6N6</author>
        <category>Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=992597</guid>
        <pubDate>Sun, 22 Jan 2006 14:16:52 +0000</pubDate>
        <title>Конвертация из одной СИ в другую</title>
        <link>https://forum.sources.ru/index.php?showtopic=129975&amp;view=findpost&amp;p=992597</link>
        <description><![CDATA[Zoobastik: В FAQ имеется пример для перевода с ограничением, что СИ не может быть более чем 36-ти значная. Ниже код, которому все-равно. Главный недостаток - жутко тормозной :). Так же имеются функции суммирования и умножения в произвольной СИ.<br>
P.S. Вроде проверил, глюков не нашел; если что пните.<br>
P.P.S. Так же есть код и на VB :)<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">const</div><div class="code_line">&nbsp;&nbsp;CharSetIn &nbsp;= &#39;0123456789ABCDEF&#39;;</div><div class="code_line">&nbsp;&nbsp;CharSetOut = &#39;01&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">// Пример конвертирует число FFA из 16-ричной СИ в двоичную</div><div class="code_line">Convert(&#39;FFA&#39;,CharSetIn,CharSetOut);</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;</div><div class="code_line">// CharSet = &quot;01234567&quot; - 8-ми ричная система исчисления</div><div class="code_line">// MyChr(0) = &quot;0&quot;, MyChr(7) = &quot;7&quot;, MyChr(8) = &quot;0&quot;</div><div class="code_line">// Всегда: A = Ai*Base^i + ... + A1*Base + A0, где Ai in CharSet</div><div class="code_line">// Base = MyChr(Len(CharSet)-1) + 1 ~ 10 (соотв. СИ)</div><div class="code_line">&nbsp;</div><div class="code_line">// РЕАЛИЗОВАННЫЕ ФУНКЦИИ</div><div class="code_line">// Convert - преобразование числа из одной СИ в другую</div><div class="code_line">// f0 - преобразование одного символа исходной СИ в другую (впомогат.)</div><div class="code_line">// MySum - сумма двух чисел в некоторой СИ</div><div class="code_line">// MyMult - произведение двух чисел в некоторой СИ</div><div class="code_line">// MyChr - по номеру возвращает символ</div><div class="code_line">// MyOrd - по символу возвращает номер в CharSet</div><div class="code_line">&nbsp;</div><div class="code_line">//**MyOrd**************************************************************</div><div class="code_line">function MyOrd(A: Char; CharSet: String): Integer;</div><div class="code_line">var i: Integer;</div><div class="code_line">begin</div><div class="code_line">Result:=0;</div><div class="code_line">for i:=1 to Length(CharSet) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;if CharSet[i]=A then</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Result:=i-1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; exit;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//**MyChr**************************************************************</div><div class="code_line">function MyChr(Num: Integer; CharSet: String): Char;</div><div class="code_line">begin</div><div class="code_line">Result := CharSet[Num mod Length(CharSet) + 1];</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//**MySum************************************************************</div><div class="code_line">function MySum (A, B, CharSet: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, Pos, Add, L, L_CharSet: Integer;</div><div class="code_line">&nbsp;&nbsp;AA,BB, O, Res: String;</div><div class="code_line">begin</div><div class="code_line">if Length(A)&#62;=Length(B)</div><div class="code_line">&nbsp;&nbsp; then begin AA:=A; BB:=B; end</div><div class="code_line">&nbsp;&nbsp; else begin AA:=B; BB:=A; end;</div><div class="code_line">&nbsp;</div><div class="code_line">L:= Length(AA);</div><div class="code_line">L_CharSet := Length(CharSet);</div><div class="code_line">O:=MyChr(0, CharSet);</div><div class="code_line">&nbsp;</div><div class="code_line">for i := Length(BB) to L-1 do</div><div class="code_line">BB := O + BB;</div><div class="code_line">&nbsp;</div><div class="code_line">Add:=0;</div><div class="code_line">for i:= L downto &nbsp;1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;Pos := MyOrd(AA[i], CharSet)+MyOrd(BB[i],CharSet) + Add;</div><div class="code_line">&nbsp;&nbsp;Add := 0;</div><div class="code_line">&nbsp;&nbsp;While Pos &#62;= L_CharSet do</div><div class="code_line">&nbsp;&nbsp; &nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; Pos := Pos mod L_CharSet;</div><div class="code_line">&nbsp;&nbsp; &nbsp; Add := Add+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp;Res := MyChr(Pos, CharSet) + Res;</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">If Add&#60;&#62;0</div><div class="code_line">&nbsp;&nbsp; then Result := MyChr(Add, CharSet) + Res</div><div class="code_line">&nbsp;&nbsp; else Result:=res;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//**MyMulti************************************************************</div><div class="code_line">function MyMulti (A, B, CharSet: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;i, e, Res, AA, BB: String;</div><div class="code_line">&nbsp;&nbsp;j, k: Integer;</div><div class="code_line">begin</div><div class="code_line">AA:=&#39;&#39;;BB:=&#39;&#39;;</div><div class="code_line">k:=1; while A[k]=MyChr(0,CharSet) do k:=k+1; for j:=k to Length(A) do AA:=AA+A[j];</div><div class="code_line">k:=1; while B[k]=MyChr(0,CharSet) do k:=k+1; for j:=k to Length(B) do BB:=BB+B[j];</div><div class="code_line">&nbsp;</div><div class="code_line">i :=&#39;&#39;; Res := &#39;&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">e:=MyChr(1,CharSet);</div><div class="code_line">while (i&#60;&#62;BB) do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;Res := MySum(Res, AA, CharSet);</div><div class="code_line">&nbsp;&nbsp;i := MySum(i,e,CharSet);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">Result:= Res;</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//**f0****************************************************************</div><div class="code_line">function f0(A: Char; SetIn, SetOut: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Pos, j, L: Integer;</div><div class="code_line">&nbsp;&nbsp;Res: String;</div><div class="code_line">begin</div><div class="code_line">L := Length(SetOut);</div><div class="code_line">Pos := MyOrd(A,SetIn);</div><div class="code_line">For j := 1 To Pos div (L-1) do</div><div class="code_line">Res := MySum( Res,MyChr(L-1,SetOut),SetOut);</div><div class="code_line">Result := MySum(Res,MyChr(Pos mod (L-1),SetOut),SetOut);</div><div class="code_line">end;</div><div class="code_line">&nbsp;</div><div class="code_line">//**Convert************************************************************</div><div class="code_line">function Convert(A, SetIn, SetOut: String): String;</div><div class="code_line">var</div><div class="code_line">&nbsp;&nbsp;Base, Multiplier, N, Res: String;</div><div class="code_line">&nbsp;&nbsp;i: Integer;</div><div class="code_line">begin</div><div class="code_line">Base := MySum(f0(MyChr(Length(SetIn)-1,SetIn),SetIn,SetOut),MyChr(1,SetOut),SetOut);</div><div class="code_line">N:=MyChr(1,SetOut);</div><div class="code_line">Res:=&#39;&#39;;</div><div class="code_line">&nbsp;</div><div class="code_line">for i:= Length(A) downto 1 do</div><div class="code_line">&nbsp;&nbsp;begin</div><div class="code_line">&nbsp;&nbsp;Multiplier := f0(A[i],SetIn,SetOut);</div><div class="code_line">&nbsp;&nbsp;Res := MySum(Res,MyMulti(Multiplier,N,SetOut),SetOut);</div><div class="code_line">&nbsp;&nbsp;N := MyMulti(Base,N,SetOut);</div><div class="code_line">&nbsp;&nbsp;end;</div><div class="code_line">&nbsp;</div><div class="code_line">Result := Res;</div><div class="code_line">end;</div></ol></div></div></div></div>]]></description>
        <author>Zoobastik</author>
        <category>Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	