布尔数组变成一个数字并返回
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
时出错 boolean
s,但无法正确解压):
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 演示。
我需要将一组布尔值(30 和更多)转换为一个数字,以将其保存在数据库中 table 的一个单元格中,我想使用 java 但不是本机函数数据库。 因此,请帮助我将 10 转换为 [1,3] 并返回。 (10 = 0^0 + 2^1 + 0^2 + 2^3)
您最多可以在 int
中编码 32
个布尔值,如下所示(方法 不会在超过 32
时出错 boolean
s,但无法正确解压):
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 演示。