我有一点不寻常的问题要解决。我需要一些提示或链接才能开始。我有 10 个数据槽的队列。一旦队列已满,我需要将其发送到服务器。但是,连同该数据,我还发送开始和结束序列号。现在,这个数字必须是唯一的并且按递增顺序排列。因此,对于第一次发送,start = 1,end = 10。在第二次发送时,它将是 start = 11,end = 20,依此类推。发送队列中的数据后,将从队列中的索引 0 开始记录新条目。
我如何有效地解决这个问题?
我有一点不寻常的问题要解决。我需要一些提示或链接才能开始。我有 10 个数据槽的队列。一旦队列已满,我需要将其发送到服务器。但是,连同该数据,我还发送开始和结束序列号。现在,这个数字必须是唯一的并且按递增顺序排列。因此,对于第一次发送,start = 1,end = 10。在第二次发送时,它将是 start = 11,end = 20,依此类推。发送队列中的数据后,将从队列中的索引 0 开始记录新条目。
我如何有效地解决这个问题?
(您的问题缺少很多上下文,所以这主要是在黑暗中拍摄......)
由于任何 16 位数字都可以放入 Javaint
原语中,因此您可以:
int
通过使用合适的位掩码对数字进行与运算,将 Java 转换为 16 位数字:
i16 = i32 & 0xffff
警告:这种转换是有损的,不容易逆转。
将 16 位数字转换为 32 位,方法int
是保留一个单独的epoch int
,每次翻转时递增 1:
if (previous16 > current16)
epoch += 1;
current32 = (epoch << 16) | current16;
我认为它不会比 Java更有效。更不用说任何可以运行 Java 的 CPU 通常都会围绕任何 16 位处理器运行,也许除了一些 DSP 之外......
几个相关的问题:
注意有符号/无符号转换:Java 没有无符号类型,这可能会使事情复杂化,具体取决于您正在做什么。
请注意,根据 JLS,byte
所有操作都隐式转换为char
和原始类型。当存储在内存中时,它们是否实际上比 32 位更窄是特定于实现的。是的,这使得类型几乎没用......short
int
short