检查 BitSet 中的所有位是否都设置为 true

5
我在我的应用程序中使用了一个BitSet,并希望使用一种方法来检查BitSet中所有已使用的位是否设置为true。我知道有一种方法isEmpty()可以检查所有位是否都设置为false,但我似乎找不到正面情况。我知道我可以做一些像someBitSet.cardinality() == someBitSet.size()这样的事情,但这似乎很笨拙。我是错过了什么还是有明确的原因为什么没有实现这样的方法而实现了相反的情况?
1个回答

9
“BitSet”中没有“所有位都是1”的情况,因为您可以在任何时候设置大于目前已设置的最大位的位。假设您想在“BitSet”中保留最多10个值。因此,您设置了10个位并希望检查它们是否全部为true。但是,“BitSet”不知道您只有10个位。如果您有更多怎么办?下一次您可以调用“bitSet.set(10000)”它将起作用(“BitSet”将自动调整大小)。
请注意,“bitSet.size()”通常不是很有用:它涉及消耗的内存。当前实现始终是64的倍数,因此如果您只有10种不同的状态,“someBitSet.cardinality() == someBitSet.size()”将始终返回false。即使您使用“new BitSet(10)”创建了“BitSet”。构造函数参数只是一个期望的初始容量(就像在“ArrayList”中一样)。它仅用作性能提示。
从性能的角度来看,最好的解决方案是检查“nextClearBit(0) >= myLength”,其中“myLength”是您想要存储在“BitSet”中的最大值的数量(您应该自己保留它)。如果结果为false,则此方法可能比“cardinality()”更快。

是的,不过文档上说:位集合有一个当前大小,即位集合当前使用的位数。所以我想如果能够轻松检查它们是否全部设置为true,那么这将会很有用。编辑:好的,刚看到您的编辑。谢谢。那么我想在这里位集合可能不是我的数据结构选择了。 - conipo
@Jonathan,如果你确实需要64、128、192等位数, 那么这将起作用。其他任何初始大小都将自动扩展到下一个64的倍数(这是实现细节,你不能依赖它!)。 - Tagir Valeev
3
似乎您缺少BitSet.length()方法:“返回此BitSet的“逻辑大小”:BitSet中最高位设置的索引值加一”,这正是所需的操作,与size()相比。因此,您需要的操作是bs.length()==bs.nextClearBit(0),它可以工作并且潜在上比基于cardinality()的解决方案更有效,但仍然很笨拙。 - Holger
可以使用以下任一方法:bitSet.nextClearBit(0)==bitSet.length()bitSet.cardinality()==bitSet.length()。其中,对于非常大的位集,nextClearBit(0)可能比cardinality()更有效;考虑到具有数万/数十万元素的位集,我无法测量出速度上的任何差异。 - Jaja

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接