Operadores a nivel de bits & |

Hola,

He estado investigando un poco sobre los operadores a nivel de bits & y |, entiendo que se usan para que operen a nivel de bits sobre los números
y para mejorar el performance, pero alguien de aquí me podría ayudar con algunos ejemplos reales ?
No encuentro ejemplos en donde vea imprescindible ocuparlos,
gracias

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

Performance?

No veo cómo pueden mejorar el performance. La cosa es que esos operadores hacen el AND y OR entre dos enteros, bit por bit. Si ves la representación binaria de los números es más fácil que comprendas lo que hacen. Por ejemplo:

27 & 34 en binario 00011011 & 00100010 = 00000010

Porque bit por bit, el AND solamente da 1 cuando ambos argumentos son 1. Contando del bit menos significativo al más significativo, solamente hay 1 en ambos números en el segundo bit.

27 | 34 en binario 00011011 | 00100010 = 00111011

Porque bit por bit, el OR te da 1 cuando al menos uno de los argumentos es 1.

Y te falta un tercer operador, el XOR:

27 ^ 34 en binario 00011011 ^ 00100010 = 00111001

Bit por bit, el XOR te da 1 cuando los argumentos son distintos y 0 cuando son iguales. Es decir 0^0=0 y 1^1=0 pero 1^0 y 0^1 te dan 1 (los tres operadores de bits tienen propiedad conmutativa).

No son muy utilizados pero son bastante útiles para empacar información en un número pequeño. Por ejemplo imagina que tienes 5 propiedades de tipo   para un solo objeto. Las puedes tener en 5 variables tipo   o las puedes tener en una sola propiedad tipo   (o   o  , total son sólo 5 bits lo que necesitas). Cómo las manejarías? Pues algo así:

 

Esas constantes con el nombre de la propiedad que te interesa, tienen valores correspondientes a un solo bit encendido en distintas posiciones (1 a la 5 en este caso). Con eso, puedes comprobar si tienes varias banderas encendidas, por ejemplo si quieres una condición a la cual entras solamente si tienes prendidas las propiedades PROP1, PROP2 y PROP5):

 

Haces un OR de bits de las 3 propiedades que te interesan, que te va a dar 00010011 (o sea 19) y a eso le haces AND de bits con las banderas; si tiene tiene esos 3 bits encendidos te dará 19 y entonces entras a la condición porque 19 es mayor a 0. Pero si tiene por ejemplo las banderas PROP1, PROP2 y PROP3, no va a entrar a la condición porque falta la 5. Si tiene todas las banderas encendidas también entra a condición (la condición es tener encendidos esos 3 bits, los demás no te importan si están encendidos o no).

Otro ejemplo es si quieres entrar a una condición cuando la PROP1 o la PROP3 están encedidas:

 

Con eso entras a la condición si PROP1 o PROP3 (o ambas) están encendidas.

Un ejemplo donde ves este uso de las banderas y que puedes hacer condiciones con operadores de bits es en los Selectors de  .

El XOR es muy usado internamente en criptografía, pero pues en Java ya tienes implementaciones de los algoritmos más comunes así que no necesitas usarlo tú directamente.

Todas las propiedades

Hola, gracias por la respuesta

Hice pruebas con lo que me enseñaste y no me cuadra algo... para saber si en el flag estan todas las propiedades segun yo no como dices,
con el primer if que pones entra sólo si tiene ALGUNA de las propiedades pero no todas

Para que sea con todas es asi?
 

Imagen de ezamudio

Si quieres que solamente entre con todas las banderas, es como dices. O bien, intercambiando ands y ors...

 

También funciona.

OK

ok, probaré también ese código. Gracias

Donde ocuparlos??

Generalmente lo vas a ocupar cuando tengas que manipular hardware a muy bajo nivel, yo por ejemplo estoy usando esos operadores para comunicarme con una bascula tengo que empaquetar numeros all formato BCD (Decimal bianrio Codificado) donde se usan operadores OR AND y muchos otros, tambien suelen ocuparse cuando necesitas comunicarte con otras pc por medio de TCP/IP