Java 将一组三个整数编码为一个唯一数
所以,我的问题集很简单。我正在处理一组从[0-65535]中随机选择的三个整数,我的工作是将这些整数编码成一个唯一的数字。这是我到目前为止所做的尝试 我编写了一个名为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[
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字节)。请参阅以获取指针。太棒了。这也很有效…非常感谢。我真的很感谢你的努力和时间。。