Java 如何通过位移位在一个整数中保存多个小整数?

Java 如何通过位移位在一个整数中保存多个小整数?,java,arrays,return,bit-shift,return-type,Java,Arrays,Return,Bit Shift,Return Type,我在int[][]数组中工作,需要从静态函数返回该数组的一个字段的地址。 考虑到数组的维数将保持较小(int[32][32][32]),我想到了返回一个包含所有三个值的数字,而不是使用包含这三个数字的数组 我已经有了一个可行的解决方案,我将我的数字打包成一个字符串,并通过Integer.parseInt(String)在接收方法中解包。 不幸的是,从运行时的角度来看,这并不能很好地工作,所以我想到了位移位 很抱歉我的英语不好,希望这个简单的问题值得你花时间回答:)如果你的数字在0到255之间,这

我在
int[][]
数组中工作,需要从静态函数返回该数组的一个字段的地址。 考虑到数组的维数将保持较小(
int[32][32][32]
),我想到了返回一个包含所有三个值的数字,而不是使用包含这三个数字的数组

我已经有了一个可行的解决方案,我将我的数字打包成一个字符串,并通过
Integer.parseInt(String)
在接收方法中解包。 不幸的是,从运行时的角度来看,这并不能很好地工作,所以我想到了位移位


很抱歉我的英语不好,希望这个简单的问题值得你花时间回答:)

如果你的数字在0到255之间,这个例子将把三个数字编码成一个整数,然后再次解码

public class BitDemo {

    public static void main(String[] args) {
        int encoded = encode(20, 255, 10);
        int[] decoded = decode(encoded);

        System.out.println(Arrays.toString(decoded));
    }

    private static int[] decode(int encoded) {
        return new int[] {
                encoded & 0xFF,
                (encoded >> 8) & 0xFF,
                (encoded >> 16) & 0xFF
        };
    }

    private static int encode(int b1, int b2, int b3) {
        return (b1 & 0xFF) | ((b2 & 0xFF) << 8) | ((b3 & 0xFF) << 16);
    }
}
公共类BitDemo{
公共静态void main(字符串[]args){
int encoded=encode(2025510);
int[]解码=解码(编码);
System.out.println(Arrays.toString(已解码));
}
私有静态int[]解码(int编码){
返回新的int[]{
编码的&0xFF,
(编码>>8)和0xFF,
(编码>>16)和0xFF
};
}
专用静态整数编码(整数b1、整数b2、整数b3){

返回(b1&0xFF)|((b2&0xFF)给定
N
M
O
并且假设
N*M*O
没有溢出,您可以像这样打包和解压索引:

int packed = o * (N * M) + m * N + n;
int o = packed / (N * M);
int m = (packed % (N * M)) / N;
int n = packed % N; // is equal to (packed % (N * M)) % N
int packed = (o << (NS + MS)) | (m << NS) | n;
int o = (packed >> (NS + MS)) & ((1 << OS) - 1);
int m = (packed >> NS) & ((1 << MS) - 1);
int n = packed & ((1 << NS) - 1);
如果要使用位移位,请确保选择了
N,M,O
作为2的幂。比如说
N=2^NS
M=2^MS
O=2^OS
打包和解包如下所示:

int packed = o * (N * M) + m * N + n;
int o = packed / (N * M);
int m = (packed % (N * M)) / N;
int n = packed % N; // is equal to (packed % (N * M)) % N
int packed = (o << (NS + MS)) | (m << NS) | n;
int o = (packed >> (NS + MS)) & ((1 << OS) - 1);
int m = (packed >> NS) & ((1 << MS) - 1);
int n = packed & ((1 << NS) - 1);

int-packed=(o(NS+MS))和(1>NS)和((1)到目前为止,您尝试过什么代码?根据数字的大小,可以使用位移位。我的意思是,如果您需要存储0-99之间的值,您可以将
34
72
03
保存在一个类似
347203
的数字中。您还可以使用字符串,这样做会更容易handle@UDKOX是正确的-bas中的一种简单编码对于您的用例来说,E100很好——在许多机器上,它被小常数(1001000)除法一点也不贵,而且这个解决方案的优点是,在调试时,如果你的编码索引是以100为基数,而不是以64或256为基数,那么就更容易弄清楚你的编码索引是什么!@UDKOX这正是我的想法!我的数字在0到31之间。谢谢这个解决方案,它的工作原理和预期的一样!我似乎没有这样做o理解为什么在您的示例中,
int encoded!=2025510
。这将使调试更加容易。易于理解且编写得很好。+1.几个问题,这只使用int右边的3/4字节?@UDKOX是的,您可以添加第四个字节,即
((b3&0xFF)