首页 > 解决方案 > 将一组三个整数编码为一个唯一数字

问题描述

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

我编写了一个 java 函数,调用pack它来尝试对这些数字进行编码,如下所示

 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]

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

标签: java

解决方案


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

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

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

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

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

推荐阅读