Dentro de la programación de java, se pueden manejar enteros int como única variable que represente el estado de un objeto, sobre todo cuando el objeto puede tener más de un estado al mismo tiempo.
Suponiendo que tenemos un barco, éste puede ser pesquero, pirata, naval, mercante o de pasajeros. Estaremos de acuerdo que no puede ser pirata y naval al mismo tiempo, (siempre y cuando naval implique pertenecer al ejército de un país), pero podrá ser mercante y de pasajeros, o ni pirata ni naval.
Usialmente, para manejar todo esto, usaríamos un millón y medio de variables, un private boolean para cada estado diferente y un par de public final static boolean por cada estado para un manejo más descriptivo.
Pero... porqué no usar los bits? Un bit, dentro de un entero para saber cada uno de los estados del barco. De manera meramente lógica resulta un poco complicado, estar haciendo todas las operaciones para saber si un 4 significa que es naval y un 3 significa que es pesquero y pirata. Lo que resulta en demasiados métodos para regrezar un simple true cuando le pregunten si es o no un barco pirata.
Para eso existen los bitwize operators, comandos para hacer operaciones a nivel de bits dentro de un entero (32 bits)
Básicamente, tenemos:
| OR
& AND
^ XOR
~ NOT
También podemos utilizar "<<" y ">>" para mover las combinaciones de bits de un lado a otro dentro del mismo entero, y de esa manera inicializar nuestras variables descriptivas:
public static final int NAVAL = 1 >> 3;
Que en cristiano quiere decir que al entero "NAVAL" le asignamos el valor 1 y lo recorremos 3 lugares ( 0010000 ).
De esa manera, para verificar si es o no NAVAl, usamos & y comprobamos si el resultado es diferente o igual a 0.
110101 & 001000 = 000000
111000 & 001000 = 001000
Bien utilizado, nos sirve para ahorrar mucho código en banderas de estado.
Suponiendo que tenemos un barco, éste puede ser pesquero, pirata, naval, mercante o de pasajeros. Estaremos de acuerdo que no puede ser pirata y naval al mismo tiempo, (siempre y cuando naval implique pertenecer al ejército de un país), pero podrá ser mercante y de pasajeros, o ni pirata ni naval.
Usialmente, para manejar todo esto, usaríamos un millón y medio de variables, un private boolean para cada estado diferente y un par de public final static boolean por cada estado para un manejo más descriptivo.
Pero... porqué no usar los bits? Un bit, dentro de un entero para saber cada uno de los estados del barco. De manera meramente lógica resulta un poco complicado, estar haciendo todas las operaciones para saber si un 4 significa que es naval y un 3 significa que es pesquero y pirata. Lo que resulta en demasiados métodos para regrezar un simple true cuando le pregunten si es o no un barco pirata.
Para eso existen los bitwize operators, comandos para hacer operaciones a nivel de bits dentro de un entero (32 bits)
Básicamente, tenemos:
| OR
& AND
^ XOR
~ NOT
También podemos utilizar "<<" y ">>" para mover las combinaciones de bits de un lado a otro dentro del mismo entero, y de esa manera inicializar nuestras variables descriptivas:
public static final int NAVAL = 1 >> 3;
Que en cristiano quiere decir que al entero "NAVAL" le asignamos el valor 1 y lo recorremos 3 lugares ( 0010000 ).
De esa manera, para verificar si es o no NAVAl, usamos & y comprobamos si el resultado es diferente o igual a 0.
110101 & 001000 = 000000
111000 & 001000 = 001000
Bien utilizado, nos sirve para ahorrar mucho código en banderas de estado.
No hay comentarios:
Publicar un comentario