Я просматриваю следующий код, чтобы проверить шестнадцатеричную цифру и преобразовать ее в целое число. Код очень умный, потому что он использует разницу между капиталом и младшими буквами - 32 и бит 5. Таким образом, код выполняет один дополнительный OR
, но сохраняет один JMP
и два CMP
s.
static const int BIT_FIVE = (1 << 5);
static const char str[] = "0123456789ABCDEFabcdef";
for (unsigned int i = 0; i < COUNTOF(str); i++)
{
int digit, ch = str[i];
if (ch >= '0' && ch <= '9')
digit = ch - '0';
else if ((ch |= BIT_FIVE) >= 'a' && ch <= 'f')
digit = ch - 'a' + 10;
...
}
Do C и С++ гарантируют ASCII или значения символов [a-f] и [A-F]? Здесь гарантия означает, что верхний и нижний наборы символов всегда будут отличаться постоянным значением, которое может быть представлено бит (для трюка выше). Если нет, что говорит об этом стандарт?
(Извините за тег C и С++. Меня интересует обе языковая позиция по этому вопросу).