我被关于BitSet
消费。 BitSet
数据结构是否存储1和0?
val b = BitSet(0, 2, 3)
表示为位位置0,2和3存储1?
如果是这样,最大值是多少。没有。比特,32或64?
答案 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
特征)中有一个特殊的实现,即BitSet1
和BitSet2
,它们由一个支持,两个long,分别避免需要分配一个额外的数组来包装它们。
答案 1 :(得分:0)
位集是非负整数的集合,表示为 可变大小的位数组,打包成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]]