2012-01-13 38 views
6

Thuật toán của tôi sử dụng một mảng lớn gồm boolean và như tôi đã được dạy, nó mất 1 byte cho mỗi biến boolean. Có anyway để khai báo một mảng boolean và giảm sử dụng bộ nhớ, bởi vì tôi đang làm việc trên môi trường điện thoại.Có thể khai báo biến 1 bit trong Java không?

EDIT: Bạn tôi và tôi đang thảo luận nếu BitSet chậm hơn mảng Boolean bình thường. Vui lòng làm rõ điều này. Thuật toán vẫn cần hiệu suất như nhu cầu tốt nhất.

+12

[java.util.BitSet] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)? Hay tôi đang thiếu một cái gì đó? – Mysticial

+2

Geez ... Tôi nên dừng lại do dự và đăng những câu trả lời này ... – Mysticial

+2

@Mysticial: Hãy do dự hơn một chút do dự. ;) – Mehrdad

Trả lời

18

BitSet

Lớp này thực hiện một vector bit mọc khi cần thiết. Mỗi thành phần của bộ bit có giá trị boolean. Các bit của một BitSet là được lập chỉ mục bởi các số nguyên không âm. Các bit được lập chỉ mục riêng lẻ có thể được kiểm tra, đặt hoặc xóa. Một BitSet có thể được sử dụng để sửa đổi nội dung của một BitSet khác thông qua các phép toán logic AND, OR, và logic độc quyền HOẶC.

Link to benchmark giữa việc sử dụng boolean so BitSet

+0

Cảm ơn bạn. Nhưng hãy trả lời câu hỏi tôi vừa thêm vào trong EDIT. –

1

Bạn có thể sử dụng một EnumSet là tốt. Điều này cho phép bạn sử dụng các bit được đặt tên và có thể thân thiện hơn bằng cách sử dụng BitSet sử dụng các bit được lập chỉ mục.

Triển khai Cài đặt chuyên biệt để sử dụng với loại enum. Tất cả các phần tử trong một tập hợp enum phải đến từ một kiểu enum duy nhất được xác định, rõ ràng hoặc ngầm, khi tập hợp được tạo ra. Enum bộ được đại diện nội bộ như bits bit. Biểu diễn này cực kỳ nhỏ gọn và hiệu quả. Hiệu suất không gian và thời gian của lớp này phải đủ tốt để cho phép sử dụng nó như là một sự thay thế an toàn, chất lượng cao cho các cờ bit "int" truyền thống. Ngay cả các hoạt động hàng loạt (chẳng hạn như containsAll và retainAll) sẽ chạy rất nhanh nếu đối số của chúng cũng là một tập hợp enum.

ví dụ:

BitSet bs = new BitSet(4); 
bs.set(1); // READY 
bs.set(3); // LARGE_FLAG 
boolean largeFlag = bs.get(1); // LARGE_FLAG 
System.out.println("Using BitSet: "+bs); 

EnumSet<Settings> settings = EnumSet.noneOf(Settings.class); 
settings.add(Settings.READY); 
settings.add(Settings.LARGE_FLAG); 
boolean largeFlag2 = settings.contains(Settings.LARGE_FLAG); 
System.out.println("Using EnumSet: "+settings); 

in

Using BitSet: {1, 3} 
Using EnumSet: [READY, LARGE_FLAG] 

IMHO EnumSet là rõ ràng hơn nhiều nếu thích hợp của nó.

Các vấn đề liên quan