2016-12-02 76 views
1

我正計劃使用BitSet來操縱字節[]中的位,因爲存在一個庫。Java BitSet size()行爲

但是,從byte []創建一個BitSet後,BitSet的最小大小爲64,否則最終爲零。 是否有必須有8個字節的要求? 另外,等於零的byte []將始終顯示爲零大小。我認爲它仍然會輸出字節數組的大小?

即。

BitSet bs1 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 1}); // bs1.size() == 64 
BitSet bs2 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 0, 1}); // bs2.size() == 64 
BitSet bs3 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 1}); // bs3.size() == 128 
BitSet bs4 = BitSet.valueOf(new byte[] {0, 0, 0, 0, 0, 0, 0, 0, 0}); // bs4.size() == 0 
System.out.print(bs1.size() + " " + bs2.size() + " " + bs3.size() + " " + bs4.size()); 

我可能最終會寫我自己的功能,但我很好奇爲什麼發生這種情況。

謝謝!

+0

以及閱讀Javadoc,源代碼是隨時可用的:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet .java - 注意這個實現將這些位存儲爲'long'數組。但是 - 在依賴實現細節之前仔細考慮。文檔中描述的行爲是保證保持真實的。 – slim

回答

4

剛剛看過的Javadoc:

size()返回的實際使用空間的位數由此BitSet表示位值。

事情是:BitSet預先分配空間;這就是size()告訴你的!它不會不是告訴你有多少位完全「放入」它!

換句話說:BitSet以64個「空」位開始;只要你「投入」一個需要超過64個價值的價值;你去128位的「分配」。另請注意,size()取決於您的JDK對BitSet的實現。

你可能想看看length()或分別。 valueOf();可能會幫助你解決你的問題。

+0

這是正確的答案(閱讀Javadoc!),但我建議還提到'length()'並引用關於大小的部分是依賴於實現的。 – slim

+0

我讀過關於size()的部分,但是,我沒有閱讀valueOf()上的javadoc,它顯示了原始BitSet大小以及它不能等於零的事實。謝謝! – eggplant

+0

@eggplant相應地更新了我的答案。如果你的問題得到解決;隨時接受我的答案,然後;-) – GhostCat