2012-05-08 26 views
7

Tôi có nhu cầu về BitSet cho phép kết nối dễ dàng nhiều BitSets tạo BitSet mới. default implementation không có phương thức như vậy.Java BitSet cho phép dễ dàng ghép nối BitSets

Có bất kỳ triển khai nào trong một số thư viện bên ngoài mà bất kỳ bạn biết nào cho phép ghép nối dễ dàng không?

Ví dụ: giả sử tôi có bitmap 11111 và một mảng bit khác 010101. Tôi muốn chức năng như phụ thêm. Vì vậy, sau khi ghép nối nó sẽ dẫn đến 11111010101.

+2

Từ một BitSet không có kích thước có ý nghĩa hoặc chiều dài (trừ các bit bộ cao nhất), nó là một chút khó khăn để hiểu những gì bạn có ý nghĩa với nối. – jarnbjo

+0

@jarnbjo Tôi đã chỉnh sửa câu hỏi. Hy vọng nó có ý nghĩa bây giờ. –

+2

Đó không phải là 'ghép nối'. Đó là chuyển dịch trái và OR-ing. Tôi nghi ngờ bạn sẽ có thể đưa ra một định nghĩa mạch lạc về phiên bản nối của bạn. Ví dụ tại sao quan sát một số không đứng đầu trong '010101' trong ví dụ của bạn, và bỏ qua vô số các số không đứng đầu khác? – EJP

Trả lời

3

Không có cách nào để triển khai hiệu quả khủng khiếp này (hiệu suất bộ nhớ) vì không có phương pháp leftshift.

Điều bạn có thể làm là sử dụng rõ ràng nextSetBit cho vòng lặp - chậm nhưng hiệu quả bộ nhớ.

Phương pháp có lẽ nhanh hơn sẽ là sử dụng toLongArray trên một bản sao được chuyển chính xác thành một mảng đủ lớn, tạo bitet từ đó và hoặc với nhau. Bằng cách đó bạn không làm bất kỳ bithifting trên bit duy nhất, nhưng thay vì làm việc trên khối từ.

1

này đã làm việc cho tôi:

BitSet concatenate_vectors(BitSet vector_1_in, BitSet vector_2_in) { 
    BitSet vector_1_in_clone = (BitSet)vector_1_in.clone(); 
    BitSet vector_2_in_clone = (BitSet)vector_2_in.clone(); 
    int n = 5;//_desired length of the first (leading) vector 
    int index = -1; 
    while (index < (vector_2_in_clone.length() - 1)) { 
    index = vector_2_in_clone.nextSetBit((index + 1)); 
    vector_1_in_clone.set((index + n)); 
    } 
    return vector_1_in_clone; 
} 

Kết quả: 11111010101