2012-01-13 15 views
6

Il mio algoritmo utilizza una vasta gamma di boolean e, come mi è stato insegnato, richiede 1 byte per ogni variabile booleana. Esiste comunque la possibilità di dichiarare un array booleano e ridurre l'utilizzo della memoria, perché sto lavorando sull'ambiente telefonico.È possibile dichiarare una variabile a 1 bit in Java?

EDIT: I miei amici e io stiamo discutendo se BitSet è più lento del normale array booleano. Si prega di chiarire questo. L'algoritmo ha ancora bisogno di prestazioni come la migliore domanda.

+12

[java.util.BitSet] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)? O mi sta sfuggendo qualcosa? – Mysticial

+2

Accidenti ... dovrei smettere di esitare e postare queste come risposte ... – Mysticial

+2

@Mysticial: essere un po 'più esitante nell'esitare. ;) – Mehrdad

risposta

18

BitSet

Questa classe implementa un vettore di bit che cresce come necessario. Ogni componente del set di bit ha un valore booleano. I bit di un BitSet sono indicizzati da numeri interi non negativi. I singoli bit indicizzati possono essere esaminati, impostati o cancellati. È possibile utilizzare un BitSet per modificare il contenuto di di un altro BitSet tramite OR logico, OR logico compreso, e operazioni logiche OR esclusive.

Link to benchmark tra l'utilizzo boolean contro BitSet

+0

Grazie. Ma per favore rispondi alla domanda che ho appena aggiunto nell'EDIT. –

1

È possibile utilizzare un EnumSet pure. Ciò consente di utilizzare i bit denominati e può essere più amichevole rispetto all'utilizzo di BitSet che utilizza bit indicizzati.

Un'implementazione Set specializzata da utilizzare con tipi di enumerazione. Tutti gli elementi di un enum set devono provenire da un singolo tipo di enum che viene specificato, esplicitamente o implicitamente, quando viene creato l'insieme. I set Enum sono rappresentati internamente come bit vettori. Questa rappresentazione è estremamente compatta ed efficiente. Le prestazioni di spazio e tempo di questa classe dovrebbero essere abbastanza buone da permetterne l'uso come un'alternativa di alta qualità e tipicamente valida ai "bit flag" tradizionali basati su int. Anche le operazioni bulk (come contiene All e retainAll) dovrebbero essere eseguite molto rapidamente se il loro argomento è anche un enum set.

ad es.

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

stampe

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

IMHO EnumSet è molto più chiara se appropriato.

Problemi correlati