Converting hex character to decimal Is it possible to make this code more efficient &amp; elegant? 

int HexToDecimal(char ch)
{
    ch = tolower(ch);
    if ('a' &lt;= ch &amp;&amp; ch &lt;= 'f')
    {
        return ch - 'a' + 10;
    }
    else if ('0' &lt;= ch &amp;&amp; ch &lt;= '9')
    {
        return ch - '0';
    }
    printf("Error\n");
    return 0;
}


Update: Printing error could be ignored. By returning 0 I only mean to show that the input char is not a hex digit.
From memory (I haven't checked it) this should be the most efficient in terms of speed at the cost of a small increase in memory footprint.

Note that it does not repeat your printf("Error\n") smell.

return
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // &lt;nul&gt; ... &lt;si&gt;
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // &lt;dle&gt; ... &lt;us&gt;
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // ' ' ... '/'
"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\x00\x00\x00\x00\x00" // '0' ... '?'
"\x00\x0a\x0b\x0c\x0d\x0e\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00" // '@' 'A' ... 'O'
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 'P' ... 'Z' ... '_'
"\x00\x0a\x0b\x0c\x0d\x0e\x0f\x00\x00\x00\x00\x00\x00\x00\x00\x00" // '`' 'a' ... 'o'
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" // 'p' ... 'z' ... '~' &lt;del&gt;
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00" /// Accented/Extended
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
[c];


Added

Apologies for not being clear. This solution is not "better" than the original, just different and provably faster. I would use the originally posted code in all cases except when maximum speed is critical and only then after careful deliberation.

I posted this for completeness, it is not elegant in any way, it is only more efficient ... almost brutally so.