2017-10-08 38 views
1

我对BitSet了如指掌。 BitSet数据结构是否存储1和0?'BitSet'是否存储位或整数?

val b = BitSet(0, 2, 3) 

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

如果是这样,什么是最大值。没有。的位,32或64?

回答

0

the documentation

位集是一组被表示为打包成64位字中的位的 可变大小的数组非负整数的。存储器 bitset的占用空间由存储在 中的最大号码决定。

鉴于有添加和删除Int S中的API交易,那么我们有理由相信,可设置的最大位是最大的整数,即2^31-1。综观the sourcescala.collection.immutable.BitSet,还有也不允许负整数的断言(根据上面的描述,这使得有义):

def + (elem: Int): BitSet = { 
    require(elem >= 0, "bitset element must be >= 0") 
2

Scala中的一个BitSet被实现为Array[Long],其中每个比特信号的存在数组中的数字。在Scala中(在JVM上),Long是64位。一个这样的Long可以存储0到63的值,下一个在64到127之后,等等。这是可能的,因为我们只谈论正数,并且不需要考虑符号。

鉴于你例如:

BitSet(0, 2, 3) 

我们可以将所有这些数字存储单个Long,这在二进制将里面:

1101 

由于我们在0到63的范围内,这可以在单个Long值上运行。

一般来说,斯卡拉BitSet中存储的上限或最大值是Int.MaxValue,意思是2^31-1(2147483647)。为了存储它,你需要2147483647/64“位”代表数字,这是〜= 33554432多头。这就是为什么在大量数据中存储大量数据会花费相当大的代价,并且当您处理大约数百个数字时,这通常是一个建议。

作为边注,immutable.BitSet具有Scala中的一个特殊实现(BitSetLike性状),即BitSet1BitSet2,其分别由一个和两个长材,备份,避免了需要分配额外的阵列包他们。

相关问题