Эффективно преобразовать шестнадцатеричную строку в целое число в C?

Изменить: Теперь совместим с компиляторами MSVC, C++ и не-GNU (см. конец).

Вопрос был «наиболее hexadecimal эффективным способом». OP perfomance не указывает платформу, он hexadecimal мог компилировать для чипа android-performance ATMEL на основе RISC с 256 android-performance байтами флэш-памяти для своего slow кода.

Для протокола и для perfomance тех (таких как я), кто ценит c разницу между «самым простым perfomance способом» и «самым эффективным hexadecimal способом» и кому нравится android-performance учиться ...

static const long hextable[] = {
   [0 ... 255] = -1, // bit aligned access into this table is considerably
   ['0'] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, // faster for most modern processors,
   ['A'] = 10, 11, 12, 13, 14, 15,       // for the space conscious, reduce to
   ['a'] = 10, 11, 12, 13, 14, 15        // signed char.
};

/** 
 * @brief convert a hexidecimal string to a signed long
 * will not produce or process negative numbers except 
 * to signal error.
 * 
 * @param hex without decoration, case insensitive. 
 * 
 * @return -1 on error, or result (max (sizeof(long)*8)-1 bits)
 */
long hexdec(unsigned const char *hex) {
   long ret = 0; 
   while (*hex && ret >= 0) {
      ret = (ret << 4) | hextable[*hex++];
   }
   return ret; 
}

Он не требует speed внешних библиотек и должен perfomance быть невероятно быстрым. Он hexadecimal обрабатывает прописные и efficiency строчные буквы, недопустимые performance символы, шестнадцатеричный speed ввод нечетного размера (например: 0xfff), а faster максимальный размер ограничен faster только компилятором.

Для компиляторов, не относящихся к GCC или C++, или компиляторов, которые не принимают модное объявление Hextable.

Замените slow первый оператор этой (более efficiency длинной, но более соответствующей) версией:

static const long hextable[] = { 
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1, 0,1,2,3,4,5,6,7,8,9,-1,-1,-1,-1,-1,-1,-1,10,11,12,13,14,15,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
    -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
};

c

performance

hex

strtol

2022-09-24T05:30:54+00:00
Вопросы с похожей тематикой, как у вопроса:

Эффективно преобразовать шестнадцатеричную строку в целое число в C?