Как преобразовать строку [...]?
Начните со значения результата, равного нулю, затем для каждого символа (начиная с первого, указывая наиболее значимый) определите егозначение (в диапазоне [0:15]), умножьте полученный результат на 16 и добавьте текущее значение к.Для вашего приведенного примера это приведет к
(((0 * 16 + v('E')) * 16 + v('1')) * 16 + v('3')) + v('6')
Существуют стандартные библиотечные функции, выполняющие эту работу за вас, такие как std::strtoul
:
char* end;
unsigned long value = strtoul(hex.c_str(), &end, 16);
// ^^ base!
Указатель конца полезен для проверки того, прочитали ли вы всю строку:
if(*char == 0)
{
// end of string reached
}
else
{
// some part of the string was left, you might consider this
// as error (could occur if e. g. "f10s12" was passed, then
// end would point to the 's')
}
Если вам не нужна проверка конца, вы можете просто вместо этого передать nullptr
.
Don 't затем преобразовать обратно в строку, вы можете получить требуемые значения, маскируя (&
) и сдвигая биты (>>
), e.g получение битов [1-9]:
uint32_t b = value >> 1 & 0x1ffU;
Работа с интегралами намного эффективнее, чем работа со строками.Только если вы хотите напечатать из результата final , затем преобразовать обратно в строку (если вы используете std::ostream
, operator<<
уже выполняет работу длявы...).