根据您给出的[0,65535]范围,您的包装和拆包代码不正确.
有65,536个可能的数字,您不希望编码一个整数来更改另一个整数的编码.您应该使用一个常量设置为65536(即216).
public static final long PACK = 65536;
然后你的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]