Java Bitmasks e inicio de seguridad
Pregunta
Ok, realmente no entiendo cómo funciona este bucle, es la declaración lógica la que más me molesta. Los permisos son un valor constante que he asignado 127. roles.java contiene valores constantes que determinan qué roles pueden acceder a ciertas páginas de un sitio web. El problema es que la instrucción lógica devuelve verdadero cuando Bitmask es igual a uno. ¿Cómo es esto posible?
for (int bitMask = 1; bitMask <= 0x8000; bitMask *= 2)
{
boolean hasBit = (permissions & bitMask) != 0;
if (hasBit)
{
String role = Roles.getRole(bitMask);
if (role != null)
{
//Do stuff
}
else
{
//No role assigned
}
}
Solución
El equivalente binario de cada uno de estos números
127 == 1111111
1 == 1
El y el operador devolverían bits que se establecen en ambos permission
Y bitMask
. Entonces el Resuidio es
1
cual es != 0
Es posible que permissions
debiera ser 128
, porque
128 == 10000000
Lo que daría como resultado el cero que estás esperando.
Otros consejos
127 == 1111111, 1 == 0000001
127 & 1 == 1
Qed.