我在查看以下代码,用于测试一个十六进制数字并将其转换为整数。该代码有些巧妙,因为它利用了大写字母和小写字母之间的差异是32,即第5位,所以代码执行了一个额外的OR
,但节省了一个JMP
和两个CMP
。
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;
...
}
C和C ++是否保证ASCII或[a-f]和[A-F]字符的值?这里,保证意味着大小写字符集始终将以可以用一个位表示的常量值相差(对于上述技巧)。如果没有,标准如何描述它们?
(抱歉使用C和C ++标签。我对两种语言在这个主题上的立场感兴趣)。
a
<b
。但这将使我们进入真正邪恶的领域。 - MSalters