布尔数组变成一个数字并返回

Array of booleans into one numeric and back

我需要将一组布尔值(30 和更多)转换为一个数字,以将其保存在数据库中 table 的一个单元格中,我想使用 java 但不是本机函数数据库。 因此,请帮助我将 10 转换为 [1,3] 并返回。 (10 = 0^0 + 2^1 + 0^2 + 2^3)

您最多可以在 int 中编码 32 个布尔值,如下所示(方法 不会在超过 32 时出错 booleans,但无法正确解压):

public static int pack (boolean[] values) {
    int n = 0;
    for(int i = 0; i < values.length; i++) {
        n <<= 0x01;
        if(values[i]) {
            n |= 0x01;
        }
    }
    return n;
}

等同于你可以将 64 bools 打包到 long.

解压:

public static boolean[] unpack (int n) {
    boolean[] res = new boolean[32];
    for(int i = 31; n != 0x00; i--) {
        if((n&0x01) != 0x00) {
            res[i] = true;
        }
        n >>>= 0x01;
    }
    return res;
}

但是请注意你没有对数组的长度进行编码 - 没有可靠的方法来重建数组的长度,你要么需要提前知道它,或将其存储在数据库中。如果稍后您将 int 解压缩为布尔值,则该数组将为 32 布尔值。但是,如果您对 30 布尔值进行了编码,则可以 忽略前 2.

或者如果您知道数组的长度

public static boolean[] unpack (int n, int length) {
    boolean[] res = new boolean[length];
    for(int i = length-1; n != 0x00 && i >= 0; i--) {
        if((n&0x01) != 0x00) {
            res[i] = true;
        }
        n >>>= 0x01;
    }
    return res;
}

查看此 jdoodle 演示。