2011-10-22 39 views
5

是否有一些很好的文本,書籍,pdf或網站介紹瞭如何實現位矢量,特別是在Java中?如何實現位向量(bitset)(Java)?

我問這個問題,因爲我想在Java中做我自己的BitSet實現。原因是我想添加附加功能和調整,如果我從java.util修改BitSet Java類,則無法完成。此外,我想自己做一些實現,以便我可以在開源項目中使用它,而無需處理許可證。

謝謝!

+0

Apache Mahout有一個開源的bitset。 – bmargulies

+1

爲什麼不使用其他位集並繼承它們? –

回答

5

如果您想爲您的位向量或位集設置奇特的性能或其他奇特功能,那麼您應該繼承現有的位向量/集的實現。或者,您可以參考一些開源實現。但是,如果您想了解位矢量的機制,則它非常簡單。以下是一個實現示例:

class BitSet{ 
    private Byte[] p; 

    private BitSet(){ 
     p = null; 
    } 

    public BitSet(int n){ 
     assert n > 0; 
     p = new Byte[(n - 1) >> 3 + 1]; 
    } 

    public BitSet Complement(){ 
     BitSet bs = new BitSet(); 
     bs.p = new Byte[p.length]; 
     for(int i = 0; i < p.length; i++){ 
      bs.p[i] = ~ p[i]; 
     } 
     return bs; 
    } 

    public BitSet Union(BitSet bs2){ 
     assert p.length == bs2.p.length; 
     BitSet bs = new BitSet(); 
     bs.p = new Byte[p.length]; 
     for(int i = 0; i < p.length; i++){ 
      bs.p[i] = p[i] | bs2.p[i]; 
     } 
     return bs; 
    } 

    public BitSet Intersection(BitSet bs2){ 
     assert p.length == bs2.p.length; 
     BitSet bs = new BitSet(); 
     bs.p = new Byte[p.length]; 
     for(int i = 0; i < p.length; i++){ 
      bs.p[i] = p[i] & bs2.p[i]; 
     } 
     return bs; 
    } 
} 

您可以在上面的示例中實現並添加您自己的基於集合的操作功能。

2

快速實施您的需求。希望能幫助到你。

public class BitSet 
    { 
     int[] numbers; 
     public BitSet(int k){ 
      numbers = new int[(k >> 5) + 1]; 
     } 
     public void set(int k) 
     { 
      int remender = k & 0x1F; 
      int devide = k >> 5; 
      result[devide] = result[devide] | (1<<remender); 
     } 

     public void unset(int k) 
     { 
      int remender = k & 0x1F; 
      int devide = k >> 5; 
      result[devide] = result[devide] & (~(1<<remender)); 
     } 

     public boolean isSet(int k) 
     { 
      int remender = k & 0x1F; 
      int devide = k >> 5; 
      return (result[devide] & (1<<remender))!=0; 
     } 
    } 
+0

你的結果在哪裏初始化 –