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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2010, 18:55   #1
weintrauber
Новичок
Джуниор
 
Регистрация: 22.04.2010
Сообщений: 2
По умолчанию Работа с шестнадцатиричными числами.

Мне нужно перевести целое число из шестнадцатиричной в десятичную.

Я знаю, что для перевода числа в шестнадцатеричную есть функция IntToHex() из модуля Sysutils.hpp.

А есть обратная ей - из десятичной в шестнадцатиричную? Или придётся самому реализовывать алгоритм?
weintrauber вне форума Ответить с цитированием
Старый 23.04.2010, 17:39   #2
RUSt88
Участник клуба
 
Регистрация: 29.12.2009
Сообщений: 1,166
По умолчанию

это легко реализуется
(написано на делфи)
Код:
// возводим в степень step любое число value
function stepen(value: integer; step: Byte): Integer;
var
  i, res: Integer;
begin
  if step = 0 then begin // если степень 0, то результат 1
    Result := 1;
  end
  else if step = 1 then begin // если степень 1, то результат само число
    Result := value;
  end
  else begin
    res := value;
    for i := 2 to step do begin // каков размер степени, столько раз и умножаем число
      res := res * value;
    end;
    Result := res; // возвращаем результат
  end;
end;

// функция возвращает десятичное число из двоичного представления
function BinToDec(s: string): Integer;
var
  i, res, j: Integer;
begin
  res := 0;
  j := 0;
  // алгоритм такой:
  // 0110 = 0 * 2^3 + 1 * 2^2 + 1 * 2^1 + 0 * 2^0
  // т.е. берем строку и считаем каждый символ слева направо умножая его на 2 в степени, соответст положению символа в строке, считая что положение последнего символа равно 0
  for i := Length(s) - 1 downto 0 do begin 
    Inc(j);
    res := res + StrToInt(s[j]) * stepen(2, i);
  end;
  Result := res;
end;

// функция возвращает десятичное число из шестнадцатиричного представления
function HexToDec(s: string): Integer;
var
  i, j, res: Integer;
// здесь идет вложение функции в функцию
function CharToByte(c: Char): Byte; // функция возвращает из hex-буквы соответств ей число, напр A = 10, F = 16 и т.д.
var
  i: Integer;
begin
  case c of
    'A', 'a': Result := 10; // без разницы маленькие буквы будут или большие
    'B', 'b': Result := 11;
    'C', 'c': Result := 12;
    'D', 'd': Result := 13;
    'E', 'e': Result := 14;
    'F', 'f': Result := 15;
  else
    Result := StrToInt(c); // если число, то ничего не меняем
  end;
end;
begin
  res := 0;
  j := 0;
  for i := Length(s) - 1 downto 0 do begin // цикл по строке с шестнадатиричным числом
    Inc(j);
    // алгоритм тот же, что и BinToDec, только умножаем не на 2, а на 16 в нужной степени
    res := res + CharToByte(s[j]) * stepen(16, i); 
  end;
  Result := res; // возвращаем результат
end;
прогер C\C++\C#\Delphi
ася: [семь 3]-[97]-[1 шесть]
RUSt88 вне форума Ответить с цитированием
Старый 23.04.2010, 17:50   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

на Делфи можно было использовать IntToStr
попробуйте и тут
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.04.2010, 19:23   #4
weintrauber
Новичок
Джуниор
 
Регистрация: 22.04.2010
Сообщений: 2
По умолчанию

Меня интересовало именно наличие подобной библиотечной функции. Как я понял такой функции нет. Но все равно, спасибо.
weintrauber вне форума Ответить с цитированием
Старый 23.04.2010, 19:59   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
А есть обратная ей - из десятичной в шестнадцатиричную? Или придётся самому реализовывать алгоритм?
sprintf .
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 23.04.2010, 20:20   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Можно ещё strtol, только она возвращает long int(что, впрочем, не отличается от int на 32-х битных осях)
Код:
long int i = strtol("0x10", 0, 16); // 16 - основание сис-мы счисления. 0x в строке может отсутствовать
netrino вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с числами в С++ Mashul'ka Помощь студентам 2 04.11.2009 14:36
Работа с большими числами SanekIrk Общие вопросы Delphi 3 11.07.2008 22:11
Работа с числами Drain Общие вопросы Delphi 10 11.02.2008 16:35
работа с большими числами sasadabest Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 16.10.2007 10:51
работа с вещественными числами Soule Паскаль, Turbo Pascal, PascalABC.NET 1 12.10.2007 09:33