【问题标题】:Is it possible to declare an 1-bit variable in Java?是否可以在 Java 中声明一个 1 位变量?
【发布时间】:2012-01-13 05:18:16
【问题描述】:

我的算法使用大量 boolean 数组,正如我所学的,每个布尔变量需要 1 个字节。无论如何要声明一个布尔数组并减少内存使用量,因为我正在使用手机环境。

编辑:我和我的朋友正在讨论 BitSet 是否比普通布尔数组慢。请澄清这一点。该算法仍然需要性能作为最佳需求。

【问题讨论】:

  • java.util.BitSet?还是我错过了什么?
  • 天啊...我应该停止犹豫并将这些作为答案发布...
  • @Mysticial:犹豫时要多犹豫一些。 ;)
  • 一个 int 数组和位掩码可能是一个选项?

标签: java android memory memory-management boolean


【解决方案1】:

BitSet

这个类实现了一个根据需要增长的位向量。每个 位集的组成部分有一个布尔值。 BitSet 的位是 由非负整数索引。单独的索引位可以是 检查、设置或清除。一个 BitSet 可用于修改 另一个 BitSet 的内容通过逻辑 AND,逻辑包含 OR, 和逻辑异或运算。

Link to benchmark 在使用 booleanBitSet 之间

【讨论】:

  • 谢谢。但请回答我刚刚在编辑中添加的问题。
【解决方案2】:

您也可以使用EnumSet。这允许您使用命名位,并且比使用使用索引位的 BitSet 更友好。

用于枚举类型的专用 Set 实现。枚举集合中的所有元素都必须来自一个枚举类型,该枚举类型在创建集合时显式或隐式指定。枚举集在内部表示为位向量。这种表示非常紧凑和高效。这个类的空间和时间性能应该足够好,以允许它用作传统的基于 int 的“位标志”的高质量、类型安全的替代品。如果参数也是枚举集,即使批量操作(例如 containsAll 和 retainAll)也应该运行得非常快。

例如

BitSet bs = new BitSet(4);
bs.set(1); // READY
bs.set(3); // LARGE_FLAG
boolean largeFlag = bs.get(1); // LARGE_FLAG
System.out.println("Using BitSet: "+bs);

EnumSet<Settings> settings = EnumSet.noneOf(Settings.class);
settings.add(Settings.READY);
settings.add(Settings.LARGE_FLAG);
boolean largeFlag2 = settings.contains(Settings.LARGE_FLAG);
System.out.println("Using EnumSet: "+settings);

打印

Using BitSet: {1, 3}
Using EnumSet: [READY, LARGE_FLAG]

恕我直言,如果合适的话,EnumSet 会更清晰。

【讨论】:

    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多