2012-01-13 20 views
6

Mi algoritmo utiliza una gran variedad de boolean, y como me enseñaron, toma 1 byte para cada variable booleana. ¿Hay alguna forma de declarar una matriz booleana y reducir el uso de memoria, porque estoy trabajando en el entorno del teléfono?¿Es posible declarar una variable de 1 bit en Java?

EDITAR: Mi amigo y yo estamos discutiendo si BitSet es más lenta que la matriz booleana normal. Por favor aclara esto. El algoritmo aún necesita rendimiento como la mejor demanda.

+12

[java.util.BitSet] (http://docs.oracle.com/javase/1.4.2/docs/api/java/util/BitSet.html)? ¿O me estoy perdiendo algo? – Mysticial

+2

Caray ... Debo dejar de dudar y publicar esto como respuestas ... – Mysticial

+2

@Mysticial: Sé un poco más vacilante en dudar. ;) – Mehrdad

Respuesta

18

BitSet

Esta clase implementa un vector de bits que crece a medida que sea necesario. Cada componente del conjunto de bits tiene un valor booleano. Los bits de un BitSet son indexados por enteros no negativos. Los bits indexados individuales pueden ser examinados, configurados o borrados. Un BitSet se puede usar para modificar el contenido de de otro BitSet a través de operaciones lógicas AND, lógicas o inclusivas, y operaciones OR exclusivas lógicas.

Link to benchmark entre el uso de boolean frente BitSet

+0

Gracias. Pero responda la pregunta que acabo de agregar en el EDIT. –

1

Puede utilizar un EnumSet también. Esto le permite usar bits con nombre y puede ser más amigable que usar BitSet que usa bits indexados.

Una implementación de conjunto especializado para usar con tipos enum. Todos los elementos en un conjunto enum deben provenir de un solo tipo de enumeración que se especifica, explícita o implícitamente, cuando se crea el conjunto. Los conjuntos Enum están representados internamente como vectores de bits. Esta representación es extremadamente compacta y eficiente. El rendimiento de espacio y tiempo de esta clase debería ser lo suficientemente bueno como para permitir su uso como una alternativa de alta calidad y segura para tipos de "indicadores de bits" tradicionales basados ​​en int. Incluso las operaciones masivas (como containsAll y retainAll) deberían ejecutarse muy rápidamente si su argumento también es un conjunto de enumeración.

e.g.

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

impresiones

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

mi humilde opinión EnumSet es mucho más claro si es apropiado.

Cuestiones relacionadas