Преобразование десятичной строки в шестнадцатеричную строку без сохранения в целое число

У меня есть строка с десятичным значением. Мне нужно преобразовать это в шестнадцатеричное десятичное значение. Я знаю, что сначала нужно преобразовать строку в целое число, используя stoi, а затем преобразовать в шестнадцатеричный формат, используя stringstream std::hex.

std::string hexString(std::string decimalString)
{
    std::stringstream ss;
    int val = std::stoi(decimalString);
    ss << std::hex << val;
    return ss.str();
}

Поскольку мне нужен строковый вывод, есть ли способ конвертировать напрямую без преобразования сначала в целое число, а затем в шестнадцатеричный.


person Arun    schedule 01.02.2018    source источник
comment
Вы знаете, что это нужно, и спрашиваете о том, нужно ли это?   -  person Yunnosch    schedule 01.02.2018
comment
Не в стандарте, вы могли бы потратить свое время на создание своего собственного, но я думаю, что ваша функция более чем хороша, если она отвечает вашим потребностям.   -  person Blasco    schedule 01.02.2018
comment
Я не думаю, что есть более простой способ, чем преобразование строки в десятичное число и преобразование десятичного числа в шестнадцатеричное. Я подожду, пока кто-нибудь докажет, что я не прав.   -  person R Sahu    schedule 01.02.2018


Ответы (1)


Конечно, вы можете реализовать преобразование непосредственно в std::string, манипулируя строковыми символами как цифрами. Однако вам придется реализовать умножение и сложение для таких чисел, и это будет намного медленнее, чем позволить процессору делать это.

В общем, эффективное преобразование между основаниями A и B путем отображения возможно только в определенных случаях, самый простой из которых, когда B является степенью A (или A of B), например, если A = 2 и B = 4:

1101010010
 3 1 1 0 2

поэтому 1101010010-base2 становится 31102-base4, преобразование выполняется путем сопоставления пар цифр base2 с цифрами base4. Обратите внимание, что это по сути то же самое, просто промежуточное целое теперь имеет ширину всего 2 бита, но, по крайней мере, ширина промежуточного звена не зависит от ширины входных данных.

person Uprooted    schedule 01.02.2018