Показать сообщение отдельно
  #6  
Старый 27.10.2016, 23:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Ну давай смотреть.
Функция:
Код:
function StrToIntM(s:string;M:word):int64;
var
i:integer;
begin
s:='0'+Trim(s);
Result:=0;i:=1;
while (i <= Length(s)) and (s[i] in [Symb[0]..Symb[M-1]]) do inc(i);
if i > Length(s) then
    for i:=1 to length(s) do
        case s[i] of
        '0'..'9':Result:=Result*M + ord(s[i])-48;
        'A'..'F':Result:=Result*M + ord(s[i])-55;
        'a'..'f':Result:=Result*M + ord(s[i])-87;
        end    //case
else
Result:=-1;
end;
вход - ('1010',2), те. 1010 в двоичной системе.
Сама функция переводит из какой-то системы (опр. 2-ым параметром) в десятичную.

сначала очищаем от пробелов и добавляем '0' спереди. Т.е имеем ('01010',2)
Дальше, выясняем, на какой позиции строки у нас есть символ, не входящий в список разрешенных (это цикл While - в условии проверяется вхождение символа в диапазон, верхняя граница которого вычисляется в зависимости от системы исчисления).
Дальше есть if. Если у нас все-таки встретились какие-то неправильные символы, то возвращаем -1 и выходим (это Else If'а). А вот если мы считаем, что все ОК, то приступаем к переводу.
Сам перевод достаточно прост. Сдвигаем текущий результат на разряд влево (путем умнодения на основание системы исчисления) и прибавляем текущее значение (три варианта, бо как цифры и буквы разного регистра находятся в разных местах ASCII таблицы, а там просто идет вычисление через код символа).

Ну вот примерно так. Теорию перевода я тебе уже дал. Вторую функцию и сам сможешь разобрать, там еще проще.
Ответить с цитированием