“BitSet”存储位或整数吗?

时间:2017-10-08 15:39:11

标签: scala bit-manipulation bitset

我被关于BitSet消费。 BitSet数据结构是否存储1和0?

val b = BitSet(0, 2, 3) 

表示为位位置0,2和3存储1?

如果是这样,最大值是多少。没有。比特,32或64?

2 个答案:

答案 0 :(得分:3)

Scala中的BitSet实现为Array[Long],其中每个位都表示数组中存在数字。 Scala中的Long是64位(在JVM上)。一个这样的Long可以存储值0到63,下一个值可以存储在64到127之间,依此类推。这是可能的,因为我们只讨论正数,而不需要考虑符号。

鉴于你的例子:

BitSet(0, 2, 3)

我们可以将所有这些数字存储在单个Long中,二进制文件为:

1101

由于我们在0到63的范围内,因此它适用于单个Long值。

通常,Scala中BitSet内存储的上限或最大值为Int.MaxValue,表示2^31-1(2147483647)。为了存储它,你需要2147483647 / 64“位”代表数字,这是〜= 33554432长。这就是为什么在一个集合中存储大量数字会变得非常昂贵的原因,并且通常只在处理大约数百个数字时才建议这样做。

作为旁注,immutable.BitSet在Scala(BitSetLike特征)中有一个特殊的实现,即BitSet1BitSet2,它们由一个支持,两个long,分别避免需要分配一个额外的数组来包装它们。

答案 1 :(得分:0)

来自the documentation

  

位集是非负整数的集合,表示为   可变大小的位数组,打包成64位字。记忆   bitset的占用量由存储的最大数量决定   它

鉴于API处理添加和删除Int的问题,那么可以合理地认为可以设置的最大位是最大整数,即2^31-1。查看scala.collection.immutable.BitSet def + (elem: Int): BitSet = { require(elem >= 0, "bitset element must be >= 0") ,还有一个不允许使用负整数的断言(根据上面的描述,这是有道理的):

inputHelper: [[String | Int]]