2012-02-17 47 views
47

我正在尋找一個好的Java BitSet示例以使用0和1s。我試着看着Javadocs,但是我不明白這個類的用法。例如,and,orxor方法如何在兩個不同的BitSet對象上工作?Java BitSet示例

例如:

BitSet bits1 = new BitSet(); 
    BitSet bits2 = new BitSet(); 

    bits2.set(1000001); 
    bits1.set(1111111); 

    bits2.and(bits1); 

    System.out.println(bits2); 

如果我這樣做,它返回bits2爲空,這是爲什麼?

+2

http://en.wikipedia.org/wiki/Bitwise_operation - 他們的工作方式與他們在使用'&|時相同。 ^'等與原始數字類型。 – 2012-02-17 18:49:04

+0

什麼,具體來說,你不明白?你創建一個BitSet,然後調用它的函數,比如'.and','.or'和'.xor'。每個函數都將另一個BitSet對象作爲參數。 – Tony 2012-02-17 18:51:49

+0

嗯,我試着對上面的例子做一個'和',並且bitset變空了。 – 2012-02-17 18:58:40

回答

94

對於您提到的具體問題:當您撥打bits2.set(1000001)時,將第一百萬位和第一位設置爲true。然後,當你與bits1相交時,其中有一百一十一萬一千一百一十一位被設置,它們沒有共同的位。

我想你意思做的是

bits2.set(0); // set the 0th bit 
bits2.set(6); // set the 6th bit 

這是否幫助清楚的事情了?

8

以下是有關的BitSet一些鏈接,這將有助於您:

UPDATE:

在文檔,它是說:

公共無效集(INT bitIndex處)

Sets the bit at the specified index to true. 

所以,當你調用bits2.set(10);,它被認爲是10進制沒有所以你得到的是以下數量1000000000

爲了正確設置,在本例中,我想將第二位設置爲1,所以我撥打bits2.set(1);,因爲索引從開始。

結論,對於設置爲1的每個位,您需要調用bitSet.Set併爲其提供位索引。

39

BitSet沒有方便的方法來接受像這樣的位串。我在下面提供了一些,現在這個例子按照你的預期工作。請注意,這使用Java 7中的新功能;它很容易在網上找到這些方法的實現,如果你想如果你想與位工作,你可以在Java 7中使用int值使用Java 6

import java.util.BitSet; 

class Scratch { 
    public static void main(String[] args) { 
     BitSet bits1 = fromString("1000001"); 
     BitSet bits2 = fromString("1111111"); 

     System.out.println(toString(bits1)); // prints 1000001 
     System.out.println(toString(bits2)); // prints 1111111 

     bits2.and(bits1); 

     System.out.println(toString(bits2)); // prints 1000001 
    } 

    private static BitSet fromString(final String s) { 
     return BitSet.valueOf(new long[] { Long.parseLong(s, 2) }); 
    } 

    private static String toString(BitSet bs) { 
     return Long.toString(bs.toLongArray()[0], 2); 
    } 
} 
+1

完美!我喜歡你的'toString(BitSet bs)'方法。很有用!您可以反轉這些位以將bit_0放在右側。 – 2015-02-11 12:23:19

52

int bits2 = 0b1000001; 
int bits1 = 0b1111111; 
bits2 &= bits1; 
System.out.println(Integer.toBinaryString(bits2)); 

打印

1000001 
+0

當你把它們保存爲'ints'時,他們是在'4字節還是'7位'? – daydreamer 2015-10-20 21:39:39

+1

@daydreamer查看[源代碼](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java)顯示'BitSet'在幕後實現爲'long []'。 「第i位在比特位置i%64處存儲在比特[i/64]中(其中比特位置0指的是最低有效位,而63指的是最高有效位)。」所以至少BitSet將使用64位。即使是參數化的構造函數也會這樣說:「創建一個初始大小足夠大的位集合**以明確地表示索引在該範圍內的位...」 – mbomb007 2016-06-16 14:05:06

4

我分享我的執行創建使用位作爲輸入的字符串位集合對象。

private static BitSet createFromString(String s) { 
    BitSet t = new BitSet(s.length()); 
    int lastBitIndex = s.length() - 1; 

    for (int i = lastBitIndex; i >= 0; i--) { 
     if (s.charAt(i) == '1'){ 
      t.set(lastBitIndex - i);        
     }    
    } 

    return t; 
} 

對於字符串輸入 「1001」

BitSet s1 = createFromString("1001"); 
    System.out.println(s1); 

輸出:

{0, 3} 
+1

爲什麼使用while循環? for循環可以做得更好,因爲在每次迭代中你都會減少1。 – 2014-09-19 14:34:00

+0

編輯:使用For循環的代碼的更好的版本,感謝@Clément的建議:) – 2014-11-16 18:05:05

0

試試這個:

import java.util.BitSet; 

public class BitSetExample { 

    public static void main(String args[]){ 
     BitSet bits1 = new BitSet(7); 
     BitSet bits2 = new BitSet(7); 

     // set some bits 
     for(int i = 0; i < 7; i++) { 
      if((i % 2) == 0) bits1.set(i); 
      if((i % 3) != 0) bits2.set(i); 
     } 

     System.out.println("BitSet1: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits1.get(i)? "1 ": "0 "); 
     } 

     System.out.println("\nBitSet2: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits2.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 

     //And 
     bits1.and(bits2); 

     System.out.println("b1 = b1 AND b2\nBitSet1: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits1.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 
     System.out.println("BitSet2: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits2.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 

     //Or 
     bits1.or(bits2); 

     System.out.println("b1 = b1 OR b2\nBitSet1: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits1.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 
     System.out.println("BitSet2: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits2.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 

     //Xor 
     bits1.xor(bits2); 

     System.out.println("b1 = b1 XOR b2\nBitSet1: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits1.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 
     System.out.println("BitSet2: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits2.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 

     //Setting bits to zero and one 
     bits1.set(1); 
     bits2.set(1,false); 

     System.out.println("set bit 1 of BitSet1 to one and set bit 1 of BitSet2 to zero\nBitSet1: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits1.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 
     System.out.println("BitSet2: "); 

     for(int i = 0; i < 7; i++) { 
      System.out.print(bits2.get(i)? "1 ": "0 "); 
     } 

     System.out.println(); 

    } 
} 

我希望這是有益的。欲瞭解更多信息,請訪問:https://github.com/m-vahidalizadeh/foundations/blob/master/src/data_structures/BitSetExample.java