Причина проста.Если znak
равно 10, то вы хотите вернуть 'a'
, но вы возвращаете 'a'+10
.Так что вместо этого верните znak+add-10
.
Но вы делаете это чрезвычайно сложно для себя.Магические константы повсюду и чрезвычайно сложный код для простой задачи.Это будет делать:
{
znak &= 0x0F;
if(znak > 9)
return znak + 'a' - 10;
else
return znak + '0';
}
Или это, если вы хотите быть более компактным.Вы явно не боитесь сложного кода:
{
znak &= 0x0F;
return znak > 9 ? znak + 'a' - 10 : znak + '0';
}
Вы упоминали, что пытаетесь оптимизировать этот код.Мне трудно понять, как ты мог так много с этим поделать.Вероятно, вам лучше оптимизировать больший кусок, чтобы увидеть, что-то не так с алгоритмами или чем-то еще.Но мы можем сделать второстепенную вещь в отношении первой, и это:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
static inline unsigned char ToHex4bits1(unsigned char znak)
{
{
znak &= 0x0F;
// Hint the compiler that the first branch is less likely, which
// improves branch prediction
if(unlikely(znak > 9))
return znak + 'a' - 10;
else
return znak + '0';
}
}
Прочтите об этом здесь: https://www.geeksforgeeks.org/branch-prediction-macros-in-gcc/
Но я думаю, что самый быстрый способ это:
static inline unsigned char ToHex4bits1(unsigned char znak)
{
const unsigned char ret[] = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
return ret[znak & 0x0F];
}