Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2007, 19:31   #1
SERGOO
Пользователь
 
Регистрация: 13.04.2007
Сообщений: 11
Вопрос Какой оптимальный способ в Delphi для перевода 10 системы счисления в 16с.с

Подскажите! Какой оптимальный способ в Delphi для перевода 10 системы счисления в 16с.с., 16 с.с. в 2 с.с., затем 2 с.с. в 16 с.с., 16 с.с. в 10 с.с.
SERGOO вне форума Ответить с цитированием
Старый 25.05.2007, 06:06   #2
Shurik Hacker
Проги на заказ
Пользователь
 
Аватар для Shurik Hacker
 
Регистрация: 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 с.с.
Делфист - это звучит гордо!
Shurik Hacker вне форума Ответить с цитированием
Старый 25.05.2007, 18:41   #3
SERGOO
Пользователь
 
Регистрация: 13.04.2007
Сообщений: 11
По умолчанию

Спасибо. Теперь осталось разобрать код по косточкам. Жаль что стандартных функций для таких банальных оперций нет.
SERGOO вне форума Ответить с цитированием
Старый 25.05.2007, 18:49   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Стоп, а это тогда что?

IntToHex(1234, 1) даёт строку '4D2'
IntToHex(1234, 8) ----""---- '000004D2'
пыщь
JTG вне форума Ответить с цитированием
Старый 25.05.2007, 18:58   #5
SERGOO
Пользователь
 
Регистрация: 13.04.2007
Сообщений: 11
По умолчанию

Да нет же. Я имел ввиду что отсутствует полный набор, то есть для перевода 2 с.с., 10с.с., 16 с.с. между собой, а не только 10с.с. в 16 с.с. Не очень то позаботились об этом разработчики. Но!!! Что есть, тем и будем пользоваться
SERGOO вне форума Ответить с цитированием
Старый 25.05.2007, 19:02   #6
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Ну в паскале функции возведения в степень тож не было, зато хоть мозг включали, приходилось мудрить с exp и ln =)
пыщь
JTG вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программа перевода из одной системы счисления в другую - 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