与此问题类似: How to combine three integers into one unique tag, such that the tag stays integer in C++?
但对于任意数量的整数?
如果我们想要缩小范围,可以说我们有30个整数,每个整数的值介于0和5之间。是否可以定义一个唯一定义整数列表的整数值?
答案 0 :(得分:1)
通常,您可以将多个整数与乘法和加法组合在一起。如果r
是所需值的范围(对于0-5的示例为6),则可以将它们组合为:
uint64_t sum = 0
for (int i = 0; i < n; ++i)
{
sum *= r;
sum += value[i];
}
如果您尝试合并太多值,则会出现溢出。您可以使用简单的公式预测整数中所需的位数:
bits = log(pow(r, n)) / log(2);
在您的示例中,您需要78位。这比大多数整数类型都可以存储的多,因此您无法组合所有30个值。
如果r
是2的幂,则可以使用位移而不是乘法。这稍微更有效,特别是如果您需要稍后提取原始值。这就是为什么链接问题中的答案都使用了变换。如果您的范围r
不接近2的幂,则会限制您可以合并的值的数量。