我正在编写一个程序,它需要速度和低内存开销。在其中,我必须制作一组二维布尔值,这可能会变得非常大。
在Java中,我知道布尔值是一个" overlay"到一个字符,所以它需要一个字节。
有没有办法制作一组布尔值,每个布尔值只有1位,技术上是必要的存储空间。谢谢!
答案 0 :(得分:1)
你正在寻找的是一点点领域。 Java不支持位字段。 基本上使用C / C ++,编译器为您添加位处理(1<<<<<<<<<<<<<<<<<>等)。
好的解决方法:{{3}}
答案 1 :(得分:1)
如前所述,您可以使用基元作为位数组。这不是直接使用,但至少它减少了您存储的数据量。
我在这里找到了convertToBinary方法的魔力: Integer to binary array 我们可以轻松地使用这些数字。
e.g。
public static void main(String[] args) {
Integer[] flags = {
0b0101_0101_0101_0101_0101_0101_0101_0101,
0b0101_0101_0101_0101_0101_0101_0101_0101,
0b0101_0101_0101_0101_0101_0101_0101_0101
};
for (Integer flag : flags) {
System.out.println(Arrays.toString(getBooleanArray(flag)));
}
}
private static boolean[] getBooleanArray(Integer value) {
String valueAsString = Integer.toBinaryString(value).replaceFirst("^0+(?!$)", "");
return convertToBinary(value, valueAsString.length());
}
private static boolean[] convertToBinary(int b, int size) {
boolean[] binArray = new boolean[size];
boolean bin;
for (int i = size - 1; i >= 0; i--) {
if (b % 2 == 1) bin = true;
else bin = false;
binArray[i] = bin;
b /= 2;
}
return binArray;
}
输出:
[true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true]
[true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true, false,true,false,true,false,true,false,true] [true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true,false,true ,false,true,false,true,false,true]
希望有所帮助。