|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
24.05.2007, 19:31 | #1 |
Пользователь
Регистрация: 13.04.2007
Сообщений: 11
|
Какой оптимальный способ в Delphi для перевода 10 системы счисления в 16с.с
Подскажите! Какой оптимальный способ в Delphi для перевода 10 системы счисления в 16с.с., 16 с.с. в 2 с.с., затем 2 с.с. в 16 с.с., 16 с.с. в 10 с.с.
|
25.05.2007, 06:06 | #2 |
Проги на заказ
Пользователь
Регистрация: 22.05.2007
Сообщений: 41
|
1.Перевод из 10 с.с. в любую другую.
procedure TForm1.Button1Click(Sender: TObject); VAR NUMBER_DEC: Integer; // Десятичное число (вводить без минуса и дроби) NEED_SYS: Byte; // Система в какую мы хотим перевести Buffer: Integer; // Временная переменная begin {Чтобы получить из десятичного числа число любой другой системы нужно это число делить на количество символов алфавита нужной нам системы исчисления Например: 10->2 21/2 = 10 (1)<- остаток от деления 10/2 = 5 (0) 5/2 = 2 (1) 2/2 = 1 (0) (Дальше делить нельзя 1<2) Число считаем с низу вверх 10101 10->8 482/8 = 60 (2) 60/8 = 7 (4) (Дальше делить нельзя 7<8) Число считаем с низу вверх 742 10->16 1208/16 = 75 (8) 75/16 = 4 (11=B) (Дальше делить нельзя 4<16) Число считаем с низу вверх 4B8 Будем использовать функции MOD и DIV MOD - Для получения осостатка DIV - Для выделения целой части } NUMBER_DEC:=StrToInt(DEC.Text); // Присваиваем значение NEED_SYS:=StrToInt(ComboBox1.Text); // Выбрали систему Buffer:=0; sys.Caption:=''; while NUMBER_DEC >= NEED_SYS do // Если число больше чем begin // алфввит тогда делим {Делим на алфавит и добовляем остаток в Buffer} Buffer:=NUMBER_DEC mod NEED_SYS; {Записываем символы в наш label и сразу перводит цыфры для 16-ой системы исчисления} case Buffer of 0..9: sys.Caption:= IntToStr(Buffer)+sys.Caption; 10: sys.Caption:= 'A'+sys.Caption; // Пишем с конца 11: sys.Caption:= 'B'+sys.Caption; // Т.е. с низу вверх 12: sys.Caption:= 'C'+sys.Caption; 13: sys.Caption:= 'D'+sys.Caption; 14: sys.Caption:= 'E'+sys.Caption; 15: sys.Caption:= 'F'+sys.Caption; end; {Делим на алфавит и получаем целое число для дальнейшего перевода} NUMBER_DEC:=NUMBER_DEC div NEED_SYS; end; {Последний штрих добавляем последние частное в начало нашего числа т.к. Дальше делить нельзя NUMBER_DEC<NEED_SYS} case NUMBER_DEC of 0..9: sys.Caption:= IntToStr(NUMBER_DEC)+sys.Caption; 10: sys.Caption:= 'A'+sys.Caption; 11: sys.Caption:= 'B'+sys.Caption; 12: sys.Caption:= 'C'+sys.Caption; 13: sys.Caption:= 'D'+sys.Caption; 14: sys.Caption:= 'E'+sys.Caption; 15: sys.Caption:= 'F'+sys.Caption; end; end; 2. Из 16 с.с. в 10 с.с. var i : integer s : string; begin s := '$' + ThatHexString; i := StrToInt(a); end; 3. Из 16 с.с. в 2 с.с. function HexToBin(Hexadecimal: string): string; const BCD: array [0..15] of string = ('0000', '0001', '0010', '0011', '0100', '0101', '0110', '0111', '1000', '1001', '1010', '1011', '1100', '1101', '1110', '1111'); var i: integer; begin for i := Length(Hexadecimal) downto 1 do Result := BCD[StrToInt('$' + Hexadecimal[i])] + Result; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(HexToBin('FFA1')); // Returns 1111111110100001 end; 4. Из 2 с.с. в 10 с.с. function BinTo(Value: string): Cardinal; var intX, PosCnt: Byte; begin Result := 0; PosCnt := 0; for intX := Length(Value) - 1 downto 0 do //zeichen von rechts durchlaufen case Value[intX + 1] of //prufen, ob 0 oder 1 '0': Inc(PosCnt); //bei 0 nur Pos-Zahler erhohen '1': begin //bei 1 Bit an Position einfugen Result := Result or (1 shl PosCnt); Inc(PosCnt); //und Zahler erhohen end; end; end; 5. Из 2 с.с. в 16 с.с.(делится на 2 этапа) a. Из 2 с.с. в 10 с.с. b. Из 10 с.с. в 16 с.с.
Делфист - это звучит гордо!
|
25.05.2007, 18:41 | #3 |
Пользователь
Регистрация: 13.04.2007
Сообщений: 11
|
Спасибо. Теперь осталось разобрать код по косточкам. Жаль что стандартных функций для таких банальных оперций нет.
|
25.05.2007, 18:49 | #4 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
Стоп, а это тогда что?
IntToHex(1234, 1) даёт строку '4D2' IntToHex(1234, 8) ----""---- '000004D2'
пыщь
|
25.05.2007, 18:58 | #5 |
Пользователь
Регистрация: 13.04.2007
Сообщений: 11
|
Да нет же. Я имел ввиду что отсутствует полный набор, то есть для перевода 2 с.с., 10с.с., 16 с.с. между собой, а не только 10с.с. в 16 с.с. Не очень то позаботились об этом разработчики. Но!!! Что есть, тем и будем пользоваться
|
25.05.2007, 19:02 | #6 |
я получил эту роль
Старожил
Регистрация: 25.05.2007
Сообщений: 3,694
|
Ну в паскале функции возведения в степень тож не было, зато хоть мозг включали, приходилось мудрить с exp и ln =)
пыщь
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Программа перевода из одной системы счисления в другую - Turbo Pascal 7.0. | Prescott | Помощь студентам | 5 | 19.03.2010 19:26 |
Системы счисления | vdv08 | Паскаль, Turbo Pascal, PascalABC.NET | 1 | 08.05.2008 17:32 |
Подскажите способ перевода из PayPal/SWREG в E-Gold | lexluther | Свободное общение | 1 | 30.11.2006 15:28 |