2017-01-25 25 views
-11

我嘗試在java中學習BitSet集合。我讀過它使用裏面的位。爲什麼Bitset允許不同於1和0的值?

每個*位組的組件有一個{@code布爾}值

我寫了一個小程序:

BitSet bitSet = new BitSet(); 
bitSet.set(9); 
bitSet.set(5); 
bitSet.set(3); 
System.out.println(bitSet); 
System.out.println(Arrays.toString(bitSet.toByteArray())); 

我不知道,我可以把不同的值從1和0.

另外我不明白輸出:

{3, 5, 9} 
[40, 2] 

請解釋說明此集合的用法?

+6

https://docs.oracle.com/javase/8/docs/api/java/util/BitSet.html沒有冒犯 - 但我希望6k +用戶知道如何查找oracle文檔的集合類,閱讀並理解它... – Fildor

+0

@Fildor我從此頁面的引用,你可以看到 – gstackoverflow

+0

這並沒有讓它變得更好。你爲什麼不理解文檔?我們怎麼能給你更多或更好的解釋,而不是你可以在那裏讀到的?對我來說這很清楚。我只是想明白爲什麼它不適合你。 – Fildor

回答

6

BitSet邏輯上表示「根據需要增長的位向量」(javadoc)。

當您通過new BitSet()創建它,你把所有的位設置爲0(假)。

0 5 10 
| | | 
000000000000... (virtually infinite sequence) 

使用set(x)你在位置X設置爲1(真)位(其中所述第一位置是0);例如在你的代碼中,你啓用了第3,第5和第9位。

0 5 10 
| | | 
000101000100... 

toString()報告設置爲1的位的本例中的列表,即3,5和9。

toByteArray()BitSet的內容轉換爲byte值的序列,每個包含的8個連續比特的值,在little-endian順序(即,從在BitSet至少索引開始)。在您的示例中的輸出{40, 2}來自:

7  0 15  8 <- position in BitSet 
|  | |  | 
{00101000 , 00000010} <- toByteArray(), binary 
    |   | 
{ 40  , 2 } <- toByteArray(), decimal 

希望這有助於。

+0

附加問題:當我聲明BitSet bits = new BitSet(8);''那麼我可以沒有問題執行'bits.set(15);'或檢索'bits.get(85);'(誇大,我知道,但只是爲了表明這一點)。當在BitSet.java中查找'public void set(int bitIndex)'的實現時,我發現只有在索引爲負數時才拋出異常(足夠公平)。但爲什麼不當你超過最大值。在構造函數中設置的位數?我也看到,構造函數'public BitSet(int nbits)'不包含局部變量來跟蹤在構造函數中傳遞的位數...... – GeertVc

+1

@GeertVc您傳遞給'new BitSet N)'就像比特集的_estimated_大小,並用於分配內部比特存儲。如果你設置了一個這樣的大小,'BitSet'必須擴展內部存儲來分配它,但是它仍然允許這樣做。這一原理也被用在其他'java.util'集合類中。 'new ArrayList(10)'創建一個最初由大小爲10的數組支持的列表,但如果需要,仍然允許添加多於10個元素來分配更大的數組。 – rrobby86

4

BitSet.set(int bitIndex)將指定索引處的位設置爲true。

所以bitSet.set(9);翻轉比特數9至11

在輸出:

  • System.out.println(bitSet);打印toString其結果爲根據的JavaDoc:

每指數爲其中此BitSet在設置狀態中包含一個位,該索引的十進制表示形式包含在結果中。小號

一步一步,它分裂的二進制組:1000101000

到字節:10 00101000

在2和40中的小數。

7

您設置的位號3,第5和9:

byte#  1     0 
index … 9 8 7 6 5 4 3 2 1 0 
value … 1 0 0 0 1 0 1 0 0 0 

二進制10是十進制2(2 1 = 2)。

二進制00101000是十進制40(2 3 + 2 5 = 8 + 32 = 40)。

+0

2^9怎麼樣? – gstackoverflow

+0

@gstackoverflow一個字節是8位寬。所以2^9在第二個字節結束,所以在索引爲1的字節中將會是00000010 => 2。 – Fildor

+0

aaaaa,謝謝。我明白 – gstackoverflow

相關問題