【问题标题】:Make a Java boolean with a size of 1 bit制作一个大小为 1 位的 Java 布尔值
【发布时间】:2017-08-08 07:37:30
【问题描述】:

我正在编写一个需要速度和低内存开销的程序。在其中,我必须制作一个二维布尔数组,它可能会变得非常大。

在 Java 中,我知道布尔值是 char 的“覆盖”,因此它占用一个字节。

有没有办法制作一个布尔数组,每个布尔数组只有 1 位,存储空间在技术上是必需的。谢谢!

【问题讨论】:

  • 使用BitSet
  • 他关心优化,BitSet会不会有点多?
  • 位操作通常比字节操作慢。因此,您必须在“速度”(无论您的意思是什么)和“低”内存开销(无论您的意思是什么)之间进行选择,但在这种情况下,您可能无法同时拥有两者。你应该告诉我们“非常大”有多大。 “非常”不是一个工程概念。在上面写一个数字。
  • I am writing a program which necessitates speed and a low memory overhead. 我想知道是什么让你选择了Java。 :)

标签: java memory boolean


【解决方案1】:

正如已经提到的,您可以将原语用作位数组。这不是直接使用,但至少它减少了您存储的数据量。

借助我在这里找到的方法 convertToBinary 的魔力: Integer to binary array 我们可以轻松地处理这些数字。

例如

 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]

[真、假、真、假、真、假、真、假、真、假、真、假、真、假、真、假、真、假、真、假、真、假、真、假,真,假,真,假,真,假,真] [真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真,假,真]

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    您正在寻找的是一个位字段。 Java 不支持位域。 基本上使用 C/C++,编译器会为您添加位处理(1

    很好的解决方法:Implementing a bitfield using java enums

    【讨论】:

    • 是的,java.util.BitSet 带有 Java,为您处理位,每个 boolean 占用大约一位空间,并且运行良好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-07-03
    • 2021-05-31
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多