2011-10-22 6 views
5

Có một số văn bản hay, sách, pdf hoặc trang web giải thích cách triển khai một bit bit, đặc biệt là trong Java không?Làm thế nào để thực hiện một bit bit (bitet) (trong Java)?

Tôi đặt câu hỏi này bởi vì tôi muốn thực hiện triển khai BitSet của riêng mình trong Java. Lý do là tôi muốn thêm các tính năng và tinh chỉnh quảng cáo không thể thực hiện được nếu tôi sửa đổi lớp Java của BitSet từ java.util. Hơn nữa, tôi muốn thực hiện riêng của mình để tôi có thể sử dụng nó trong dự án nguồn mở của mình mà không phải đối phó với giấy phép.

Cảm ơn!

+0

Apache Mahout có bitet nguồn mở. – bmargulies

+1

tại sao không sử dụng các bitets khác và chỉ kế thừa chúng? –

Trả lời

5

Nếu bạn muốn hiệu suất ưa thích hoặc các tính năng ưa thích khác cho bit bit hoặc bit của bạn, sau đó như một số đã được đề xuất, bạn nên kế thừa thực hiện hiện tại của bit vector/bộ. Hoặc, bạn có thể tham khảo một số triển khai nguồn mở. Tuy nhiên, nếu bạn muốn tìm hiểu cơ chế của bit bit, nó khá đơn giản. Dưới đây là triển khai ví dụ:

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; 
    } 
} 

Bạn có thể triển khai và thêm các tính năng hoạt động thiết lập của riêng mình vào ví dụ trên.

2

Triển khai nhanh cho yêu cầu của bạn. Hy vọng nó giúp.

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

kết quả của bạn được khởi tạo ở đâu –