2017-10-08 80 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,其分別由一個和兩個長材,備份,避免了需要分配額外的陣列包他們。

相關問題