2013-05-06 129 views
1

基於Javadoc,下面的代碼應該打印6。然而,它沒有明顯的原因輸出3Java BitSet奇怪的行爲

import java.util.*; 
public class BitSetStrangeness{ 
    public static void main(String[] args){ 
     BitSet foo = new BitSet(); 
     int[] arbitrary = new int[] { 
    0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,1,1,1,0,1,1,1,1,1,1,1,1,1,1,1,1,1 
     }; 
     for (int i = 0; i < arbitrary.length; i++) 
      if (arbitrary[i] == 1) foo.set(i); 
      else foo.clear(i); 
     System.out.println(foo.get(15,21).length()); 
    } 
} 

任何人都可以解釋)爲什麼我看到這種行爲和b)如何我可以修改代碼來解決它,這樣提取的比特集的長度是6,而不是3呢?

回答

2

the javadoc

返回此BitSet的「邏輯大小」:在BitSet中加一的最高設置位的索引。

長度只計算設定的位數。

位是[0, 0, 1, 0, 0, 0, 0],在第三個之後是錯誤的,因此返回的長度。

你無事可做:你的bitSet沒問題,如果你已經使用size方法就會很清楚。

+0

謝謝你的回答。 我試圖把BitSet看作是一串比特,我期待fromIndex和toIndex的get函數的行爲類似於子串函數。 – merlin2011 2013-05-06 07:15:55

0

爲什麼它應該返回6?讓我們來看看:

  1. foo.get(15,21)回報字是4。在二進制表示中,它只是100

  2. 讓我們讀BitSetjavadoclength()方法:

返回此BitSet的「邏輯大小」:最高設置位的位集索引加1。如果BitSet不包含設定位,則返回零。

好了,我們現在可以檢查它的100:最高設置位是2(從0計),加一這將是3。一切都是正確的。

0

的Javadoc BitSet#length(),說返回此BitSet的「邏輯大小」:在BitSet中最高設置位的索引加一。如果BitSet不包含設定位,則返回零。

在你的情況下,foo.get(15,21)給出BitSet[0, 0, 1, 0, 0, 0, 0]。因此結果是2+1=3