java - 将一组三个整数编码为一个唯一的数字

标签 java

所以,我的问题集很简单。我正在处理从 [0-65535] 中随机选择的一组三个整数,我的工作是将这些整数编码为一个唯一的数字。这是我到目前为止尝试过的方法

我已经编写了一个名为 pack 的 java 函数来尝试对这些数字进行如下编码

 private long pack(long a, long b, long c) {
        int N = 65535, M = 65536;
        return (a + (b * N) + c * N * M);
    }

而且我还编写了另一个 java 函数来将压缩后的数字解包或解码回原始整数,如下所示

private long[] unpack(long packed) {
    int N = 65535, M = 65536;
    long a = (packed % N);
    long b = (packed / N) % M;
    long c = (packed % (N * M));
    return new long[]{a, b, c};
}

现在,当我使用示例数据 {67, 8192, 7168} 在我的主要函数中运行上面的代码时,我在控制台输出中得到以下结果

Packing 67, 8192, 7168
Result=30786392678467

UnPacking 30786392678467
Result=[67, 8192, 57411]

从上面可以看出,我的第一个和第二个值显然总是正确的,但最后一个值似乎总是错误的。我可能错过了什么。非常感谢您的帮助。非常感谢。

最佳答案

我现在要给你一个替代解决方案,然后我可以尝试在 PC 而不是手机上调试你当前的解决方案 ( rgettman beat me! )。

因为三个数字中的每一个最大可以是 65535,这意味着每个数字将适合 16 位。出于这个原因,您可以使用以下内容简单地构建一个独特的 long:

long encoded = (a << 32L) | (b << 16) | c;

解码它看起来像下面这样:

long a = (encoded >> 32) & 0xFFFFL;
long b = (encoded >> 16) & 0xFFFFL;
long c = encoded & 0xFFFFL;

关于java - 将一组三个整数编码为一个唯一的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54814212/

相关文章:

java - 我想解析一个 html 源字符串以在 Java 中找到一个特定的标签

java - -source 1.6 不支持 multi-catch 语句(使用 -source 7 或更高版本启用 multi-catch 语句)

java - 我 setEnabled(false) 后复选框没有被禁用

java - 在进入 while (Iterator.hasNext()) 循环之前 Map.isEmpty() 有意义吗?

java - 主要 Activity 未正确引用外部 java 类

java - 如何让 JPanel 中的组件尽可能地拉伸(stretch)?

java - 如何使用 transactionId 执行 PaymentDetails 请求?

java - 为什么未模块的 JAR 可以访问模块 JAR 的非公开包?

java - 我应该传递参数还是将它们注入(inject)到需要它们的地方?

JavaFX - 工具栏按钮上消失的图标