2013-10-09 15 views
0

我正在创建一个具有固定位数的BitSet。 在这种情况下,保存二进制表示的String的长度为508个字符。Java BitSet尺寸大于nbits在构造函数中设置

所以我创建的BitSet方式如下:

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

但看BS的大小,我总是得到一个尺寸的512我可以看到,总有以0值4位在所附结束。

也许有以下文件的一些误解:

位集合(INT NBITS)

创建一个位set它的初始大小足够大,以与所述索引范围明确地表示位0到nbits-1。

BitSet是否始终增大其大小以使其大小为2的幂或它为什么更大?

回答

2

构造函数中的位数是一个大小提示,而不是允许的位数限制。 Bitset的size()实际上是其目前的容量,虽然规格比这更具弹性。

所以我不能依靠大小,如果我通过了另一个bitset?可能还会附加一些位,或者可能比“预计”更长?

正确,是的。

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

如果length()给我设置的最高位,这在每种情况下都无法帮助。因为位置508上的“我的”最高位也可以是0.

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

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

+0

所以我不能依赖大小,如果我通过了另一个bitset?可能还会附加一些位,或者可能比“预计”更长? – Stefan

+0

感谢您关注评论。 如果length()给我设置了最高位,这在任何情况下都是无效的。因为位置508上的“我的”最高位也可以是0.但是我现在明白了一点,必须考虑另外一种解决方法。谢谢。 – Stefan

2

根据the documentation,内存中的实际大小取决于实现,因此您无法确切知道你会得到什么size()。不过,作为用户不必担心它,因为BitSet的length()始终是准确的 - 即使内存中的大小较大,它也会返回实际使用的位数。

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

0

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

0

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