Я ищу наиболее эффективный способ вычисления минимального количества байтов, необходимых для хранения целого числа без потери точности.
e.g.
int: 10 = 1 byte
int: 257 = 2 bytes;
int: 18446744073709551615 (UINT64_MAX) = 8 bytes;
Спасибо
P.S. Это для хэш-функций, которые будут называться много миллионов раз
Также размеры байтов не должны быть мощностью двух
Самое быстрое решение похоже на вопрос, основанный на ответе на трон:
int bytes;
if (hash <= UINT32_MAX)
{
if (hash < 16777216U)
{
if (hash <= UINT16_MAX)
{
if (hash <= UINT8_MAX) bytes = 1;
else bytes = 2;
}
else bytes = 3;
}
else bytes = 4;
}
else if (hash <= UINT64_MAX)
{
if (hash < 72057594000000000ULL)
{
if (hash < 281474976710656ULL)
{
if (hash < 1099511627776ULL) bytes = 5;
else bytes = 6;
}
else bytes = 7;
}
else bytes = 8;
}
Разница в скорости с использованием в основном 56 бит-валов была минимальной (но измеримой) по сравнению с ответом Томаса Порнина. Также я не тестировал решение, используя __builtin_clzl, который может быть сопоставим.