我正在寻找最有效的方法来计算存储整数所需的最小字节数而不会丢失精度。
e.g.
int: 10 = 1 byte
int: 257 = 2 bytes;
int: 18446744073709551615 (UINT64_MAX) = 8 bytes;
谢谢
PS这是一个哈希函数,将被调用数百万次
字节大小也不必是二的幂
最快的解决方案似乎是基于 tronics 的答案:
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;
}
与 Thomas Pornin 的答案相比,主要使用 56 位 val 的速度差异很小(但可测量)。我也没有使用 __builtin_clzl 测试解决方案,这可能是可比的。
原文由 user75832 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您只对常见尺寸感兴趣,您只需要两个简单的
if
s。考虑一下(假设您实际上有无符号值):如果您需要测试其他尺寸,选择一个中间点然后进行嵌套测试将在任何情况下保持测试的数量非常低。但是,在这种情况下,使测试成为递归函数可能是更好的选择,以保持代码简单。一个体面的编译器将优化递归调用,以便生成的代码仍然一样快。