Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将一组三个整数编码为一个唯一数_Java - Fatal编程技术网

Java 将一组三个整数编码为一个唯一数

Java 将一组三个整数编码为一个唯一数,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); } private long[

所以,我的问题集很简单。我正在处理一组从[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);
    }
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};
}
我还编写了另一个java函数,将压缩数解包或解码回原始整数,如下所示

 private long pack(long a, long b, long c) {
        int N = 65535, M = 65536;
        return (a + (b * N) + c * N * M);
    }
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};
}
现在,当我使用示例数据
{6781927168}
在主函数中运行上述代码时,我在控制台输出中得到以下结果

Packing 67, 8192, 7168
Result=30786392678467

UnPacking 30786392678467
Result=[67, 8192, 57411]

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

根据您给出的[065535]范围,您的打包和解包代码不正确

可能有65536个数字,您不希望一个整数的编码改变另一个整数的编码。您应该使用一个常量设置为
65536
(即216)

然后您的
pack
方法会稍微更改为:

private long pack(long a, long b, long c) {
    return (a + (b * PACK) + c * PACK * PACK);
}
这将
a
压缩到长序列中最低有效的16位(位49-64),
b
压缩到位33-48,
c
压缩到位17-32。(位0-16中没有任何内容,因此这些位保持清除状态。)

此外,您的
解包方法更改为:

private static long[] unpack(long packed) {
    long a = (packed % PACK);
    long b = (packed / PACK) % PACK;
    long c = (packed / (PACK * PACK));  // Use / not %.
    return new long[]{a, b, c};
}
请注意,
c
的操作除以
PACK
平方,而不是使用
%
运算符,而是使用
/
。否则,
M
N
都被
PACK
取代

带有这些更改的输出:

Packing 67, 8192, 168
Result=722091376707

UnPacking 722091376707
Result=[67, 8192, 168]

现在,我将为您提供一个替代解决方案,然后当我使用PC而不是手机时,我可以尝试调试您当前的解决方案()

因为这三个数字中的每个数字的最大值都可以是65535,这意味着每个数字可以容纳16位。因此,您只需使用以下内容构建唯一的
long

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

实际上,您的解决方案几乎是正确的:只需确保M==N==65536并解决解包变量c时的问题

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

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

此外,我还将N的类型更改为long,尽管这并不重要,因为Java在乘法过程中将其转换为long

Hi-Mekings。由于65535=2 ^ 16—1,还可以考虑使用<代码> char < /Cord>数组。在Java中,
char
是一种16位数据类型(2字节)。请参阅以获取指针。太棒了。这也很有效…非常感谢。我真的很感谢你的努力和时间。。