【问题标题】:Java Algorithm for Batch Numbering [closed]批处理编号的 Java 算法 [关闭]
【发布时间】:2012-06-16 20:53:45
【问题描述】:

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

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

【问题讨论】:

  • 您确定这些是 10 项队列的正确开始和结束编号吗?另外,是什么阻止您只存储最后一个结束编号然后递增?
  • 我已经完成了队列编码等。只是不知道如何生成增量数字。因为,我正在使用的设备是 16 位的。所以我不确定 2^16 之后会发生什么?
  • @ArjunPatel 听起来与您提出的问题完全不同。
  • 您发送超过 65535 个数据槽的可能性有多大?此外,从您的 cmets 看来,您的实际问题比您写的问题要具体得多。我建议您在原始帖子中详细介绍。
  • @ArjunPatel:正如我所说,这里缺少很多上下文。也许您应该编辑您的问题以包含整个故事......

标签: java algorithm discrete-mathematics


【解决方案1】:

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

由于任何 16 位数字都可以放入 Java int 原语中,因此您可以:

  • 将 Java int 转换为 16 位数字,方法是使用合适的位掩码对数字进行与运算:

    i16 = i32 & 0xffff
    

    警告:这种转换是有损的,不易逆转。

  • 将 16 位数字转换为 32 位 int,方法是保留一个单独的 epoch int,每次翻转时加一:

    if (previous16 > current16)
        epoch += 1;
    
    current32 = (epoch << 16) | current16;
    

    我认为它不会比 Java 更高效。更不用说任何可以运行 Java 的 CPU 通常都可以围绕任何 16 位处理器运行,也许除了一些 DSP...

几个相关的问题:

  • 注意有符号/无符号转换:Java 没有无符号类型,这可能会使事情复杂化,具体取决于您正在做什么。

  • 请注意,根据 JLS,bytecharshort 原始类型对于所有操作都会隐式转换为 int。当存储在内存中时,它们是否实际上比 32 位更窄是特定于实现的。是的,这使得 short 类型几乎没用......

【讨论】:

  • 谢谢 thkala。这对让我思考很有帮助。
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 2021-12-26
  • 2012-12-04
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-13
  • 1970-01-01
相关资源
最近更新 更多