2011-03-11 70 views
0
  • BitSet bits1 = new BitSet(00101010); 
    System.out.println(bits1); 
    

問:爲什麼輸出返回{}。如何將值傳遞給BitSet類並創建包含BitSet值的列表?

  • List<BitSet> list = new ArrayList<BitSet>(); 
    list.add(new BitSet(00010010)); 
    list.add(new BitSet(10000001)); 
    list.add(new BitSet(01000001)); 
    System.out.println(test.orTogether(list)); 
    

無法值傳遞給該方法。由於列表包含[{},{},{}]。

回答

0

BitSet documentation

位集合(INT NBITS) 創建一個位set它的初始大小足以 大到nbits-1明確地表示與在範圍0索引 比特。

,需要準確初始化位集合(例如,用於01001):

BitSet bs = new BitSet(5); 
bs.set(0, true); 
bs.set(3, true); 
0

的位集合的構造採用int其初始大小,而不是一個二進制數。您需要設置位是這樣的:

bitset.set(2); 
bitset.set(4); 
bitset.set(6); 
6

的問題是,構造public BitSet(int)不走位,但位的數量要存儲。因此,內容仍是空的......

要設置位,您可以創建一個額外的方法:

public BitSet createBitSet(String bits) 
{ 
    int len = bits.length(); 
    BitSet bs = new BitSet(len); 
    for (int i = 0; i < len; i++) 
    { 
     bs.set(len - i - 1, bits.charAt(i) == '1'); 
    } 
    return bs; 
} 

然後:

list.add(createBitSet("00010011")); 

(我沒有測試方法,所以他們可能會出現一些錯誤...)

+0

看起來很熟悉:-)(+1) – 2011-03-11 10:47:13

+0

+1了不起的人心中都有同樣的想法;-) – 2011-03-11 10:50:48

1

構建您的BitSet對象,你可能想使用類似的方法:

static BitSet createBitSetFromString(String s) { 
    BitSet ret = new BitSet(s.length); 
    for(int i = 0 ; i < s.length() ; i++){ 
    if(s.charAt(i) == '1') { 
     ret.set(s.length() - 1 - i) ; 
    } 
    } 
    return ret ; 
} 

然後,而不是

BitSet bits1 = new BitSet(00101010); 

你可以這樣做:

BitSet bits1 = createBitSetFromString("00101010") ; 
+0

你的方法行不通。位是右對齊的,所以你要以相反的順序創建位。 – 2011-03-11 10:36:40

+0

@Martijn謝謝 - 修復 – 2011-03-11 10:40:19

+0

不客氣,現在+1(查看我的回答);) – 2011-03-11 10:47:44

1

這裏是一個簡單的工廠方法來創建BitSet從二進制輸入字符串(我複製它從this previous answer of mine):

public static BitSet createBitset(final String input){ 
    final int length = input.length(); 
    final BitSet bitSet = new BitSet(length); 
    for(int i = length - 1; i >= 0; i--){ 
     // anything that's not a 1 is a zero, per convention 
     bitSet.set(i, input.charAt(i) == '1'); 
    } 
    return bitSet; 
} 

還可以通過使用toBinaryString()

int someInt = 1234567; 
long someLong = 1234567890L; 
BitSet bitSetFromInt = 
    createBitset(Integer.toBinaryString(someInt)); 
BitSet bitSetFromLong = 
    createBitset(Long.toBinaryString(someLong)); 
System.out.println(bitSetFromInt); 
System.out.println(bitSetFromLong); 

輸出與intlong位掩碼使用它:

{0,3,5,6, 8,10,11,13,18,19,20}
{0,3,6,7,10,12,13,21,23,24,26,29}

+1

您的方法不起作用。位是右對齊的,所以你要以相反的順序創建位。 – 2011-03-11 10:38:38

+0

@Martijn你當然是對的,對不起。固定。 – 2011-03-11 10:44:04

+0

不客氣,現在+1!看看我的答案;-) – 2011-03-11 10:45:53