0

我正在创建一个具有固定位数的 BitSet。在这种情况下,保存二进制表示的字符串的长度为 508 个字符。

所以我通过以下方式创建 BitSet:

BitSet bs = new BitSet(binary.length());
// binary.length() = 508

但是看看 bs 的大小,我总是得到 512 的大小。我可以看到总是有 4 位,最后附加的值为 0。

可能对以下文档存在一些误解:

位集(整数 nbits)

创建一个位集,其初始大小足够大,可以显式表示索引范围为 0 到 nbits-1 的位。

是 BitSet 总是增加它的大小,使其大小是 2 的幂,还是为什么它更大?

4

4 回答 4

3

构造函数中的位数是大小提示,而不是对允许的位数的限制。size()Bitset 的实际容量是它的当前容量尽管规范比这更有弹性。

所以如果我通过另一个位集,我不能依赖大小?可能还附加了一些位,或者它可能比“预期”长?

正确,是的。

如果您想要逻辑大小(即设置的最高位索引),请使用length()方法,而不是size()方法。

如果 length() 给了我最高位集,这在每种情况下都无济于事。因为位置 508 上的“我的”最高位也可以是 0。

在这种情况下,“set”表示“设置为 1 / true”。因此,如果您的最高位(在位置 508)为零,length()则将小于 508。我不确定这是否有帮助。但是,如果您有一个已定义的最高位位置的概念,那么您需要将该位置表示为一个单独的值。

Bitset 实际上被建模为一个潜在的无限位数组,默认初始化为全零。(这就是为什么没有“翻转整个 Bitset”操作的原因。它会使用大量的存储空间。)

于 2013-10-09T11:22:13.200 回答
2

根据文档,内存中的实际大小取决于实现,所以你不能确定size()你会得到什么。不过,作为用户的您不必担心,因为length()BitSet 始终是准确的 - 即使内存中的大小更大,它也会返回实际使用的位数。

由于 BitSet 可以自动增长以适应添加到其中的任何数据,如果它使用类似于列表的增长策略,我不会感到惊讶,列表倾向于使用 2 的递增幂。但如前所述,这个事实是一个实现细节,它可能在任何地方和每次都不相同。

于 2013-10-09T11:24:09.270 回答
0

BitSet 大小将设置为 64 的第一个倍数,等于或大于您用于“大小”的数字。如果您指定 508 的“大小”,您将获得一个实际大小为 512 的 BitSet,这是 64 的下一个最高倍数。

于 2014-06-28T02:30:53.797 回答
0

这只是对集合的提示(这适用于我认为的所有集合),因此它不必在添加元素后自行调整大小。例如,如果您知道您的集合最多可容纳 100 个元素,则可以将其大小设置为 100,并且不会进行大小调整,这对性能更好。

于 2013-10-09T11:25:47.963 回答