Primero, algunos antecedentes: soy un maestro de TI en formación y estoy tratando de presentar a los operadores booleanos de Java a mi clase de décimo grado. Mi maestro-mentor examinó una hoja de trabajo que preparé y comentó que podría dejarles usar solo una & o | para denotar a los operadores, porque "hacen lo mismo".
Soy consciente de la diferencia entre & y &&.
& es un operador bit a bit destinado a ser utilizado entre enteros, para realizar "bit-twiddling".
&& es un operador condicional destinado a usarse entre valores booleanos.
Para probar el punto de que estos operadores no siempre "hacen lo mismo", me propuse encontrar un ejemplo en el que el uso de los valores booleanos entre bits produjera un error. Encontré este ejemplo
boolean bitwise;
boolean conditional;
int i=10, j=12;
bitwise = (i<j) | ((i=3) > 5); // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i<j) || (i=3) > 5 ; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
i=10;
bitwise = (i>j) & (i=3) > 5; // value of i after oper: 3
System.out.println(bitwise+ " "+ i);
i=10;
conditional = (i>j) && (i=3) > 5; // value of i after oper: 10
System.out.println(conditional+ " "+ i);
Este ejemplo muestra que si un valor tiene que cambiarse en la segunda mitad de la expresión, esto conduciría a una diferencia entre los resultados, ya que bitwise es un operador ansioso, mientras que el condicional se comporta como un cortocircuito (no evalúa el segundo mitad, si la primera mitad es falsa en el caso de && y verdadera en el caso de ||).
Tengo un problema con este ejemplo. ¿Por qué querrías cambiar un valor al mismo tiempo que lo comparas? No parece una forma robusta de codificar. Siempre he sido reacio a realizar múltiples operaciones en una sola línea en mi código de producción. Parece algo que haría un "vaquero codificador" sin conciencia en cuanto a la facilidad de mantenimiento de su código. Sé que en algunos dominios el código debe ser lo más compacto posible, pero ¿seguramente esta es una mala práctica en general?
Puedo explicar mi elección de fomentar el uso de && y || sobre y y | porque esta es una convención de codificación aceptada en ingeniería de software .
Pero, ¿podría alguien darme un ejemplo mejor, incluso del mundo real, del uso de un operador bit a bit en una expresión condicional?