-9

我有一点不寻常的问题要解决。我需要一些提示或链接才能开始。我有 10 个数据槽的队列。一旦队列已满,我需要将其发送到服务器。但是,连同该数据,我还发送开始和结束序列号。现在,这个数字必须是唯一的并且按递增顺序排列。因此,对于第一次发送,start = 1,end = 10。在第二次发送时,它将是 start = 11,end = 20,依此类推。发送队列中的数据后,将从队列中的索引 0 开始记录新条目。

我如何有效地解决这个问题?

4

1 回答 1

2

(您的问题缺少很多上下文,所以这主要是在黑暗中拍摄......)

由于任何 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 位更窄是特定于实现的。是的,这使得类型几乎没用......shortintshort

于 2012-06-13T21:15:09.810 回答