我有三个整数:
我需要从上面的整数中生成一个2字节的唯一整数,以便:
我已经搜索了解决方案,但是大多数解决方案将字节数从2到4个字节加倍,这在我的情况下不是一个选项。
答案 0 :(得分:4)
首先,让我们将第一个范围转换为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
以上所有数字都假定为非负数,并假设通常的整数除法舍入,即只是截断任何小数。
答案 1 :(得分:0)
将它们转换为零填充的字符串。用零填充后连接它们。然后将它们转换回整数。
所以20-1-8会成为" 020108"然后在20108,当你把它变成一个整数。
要获取数字,请重新转换为字符串并根据位数从右向左解析。
答案 2 :(得分:0)
我认为hyde意味着(第一个)+ range_of_first *第二个+ range_of_first * range_of_second *第三个 =(first-1)+ 600 * second + 600 * 5 * third =(first-1)+ 600 * second + 3000 * third。
您需要存储45000个不同的值,因此您无法将它们装入2个有符号的字节中,但它们将适合2个无符号字节。