从三个整数生成一个唯一的 2 字节整数

Generate a unique 2-byte integer from three integers

我有三个整数:

我需要根据上述整数生成一个 2 字节的唯一整数,这样:

我已经搜索了解决方案,但大多数解决方案都是将字节数从 2 字节加倍到 4 字节,这在我的情况下不是一个选项。

将它们转换成带有零填充的字符串。用零填充后连接它们。然后将它们转换回整数。

因此 20-1-8 将变为“020108”,然后当您将其转换为整数时变为 20108。

要取回数字,重新转换为字符串并根据位数从右到左解析。

首先,让我们将第一个范围转换为0-599,如下图标记为first-1。然后,您需要做的就是将数字相乘,使用范围最大值作为乘数:

range_of_first = 599 + 1 = 600
range_of_second = 4 + 1 = 5
range_of_third = 14 + 1 = 15

(first-1) + range_of_first * second + range_of_first * range_of_second * third
= (first-1) + 600*second + 600*5*third
= result

你能得到的最大值是599 + 600 * 4 + 600 * 5 * 14 = 44999

这不适合有符号的 2 字节整数 (-32768..32767)。它适合 2 字节无符号整数 (0..65535)。

如果你必须把它放入一个有符号整数中,那么最简单的就是用32位进行计算,然后从结果中减去(44999-32768),这样它就可以放入2字节有符号整数的范围内。然后在解码之前做反向。

反之则需要划分和提醒:

first = result % range_of_first + 1 // +1 to get values 1..600
second = result / range_of_first % range_of_second
third = result / range_of_first / range_of_second // % range_of_third redundant

以上所有数字均假定为非负数,并假定通常的整数除法四舍五入,即去掉所有小数。

我认为 hyde 的意思是 (first-1) + range_of_first * second + range_of_first * range_of_second * third = (first-1) + 600*second + 600*5*third = (first-1) + 600*second + 3000*third .

您需要存储 45000 个不同的值,因此您不能将它们放入 2 个有符号字节中,但它们可以放入 2 个无符号字节中。