从三个整数生成一个唯一的 2 字节整数
Generate a unique 2-byte integer from three integers
我有三个整数:
- 第一个数字的范围是 1-600
- 第二个数字的范围是 0-4
- 第三个数字的范围是 0-14
我需要根据上述整数生成一个 2 字节的唯一整数,这样:
- 再次使用相同的数字会得到相同的数字
- 能够从唯一号码取回所有三个号码
- 唯一编号应 > 0 && < 32768(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 个无符号字节中。
我有三个整数:
- 第一个数字的范围是 1-600
- 第二个数字的范围是 0-4
- 第三个数字的范围是 0-14
我需要根据上述整数生成一个 2 字节的唯一整数,这样:
- 再次使用相同的数字会得到相同的数字
- 能够从唯一号码取回所有三个号码
- 唯一编号应 > 0 && < 32768(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 个无符号字节中。