Java bitmasks e sicurezza di accesso
Domanda
Ok non capisco davvero come funziona questo ciclo, è l'affermazione logica che mi infastidisce di più. Le autorizzazioni sono un valore costante che ho assegnato 127. Ruoli.java contiene valori costanti che determinano quali ruoli possono accedere a determinate pagine di un sito Web. Il problema è che l'istruzione logica restituisce vera quando BitMask è uguale a uno. Com'è possibile?
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
}
}
Soluzione
L'equivalente binario di ciascuno di questi numeri
127 == 1111111
1 == 1
L'operatore e l'operatore restituirebbero bit impostati in entrambi permission
E bitMask
. Quindi il resuit è
1
che è != 0
È possibile questo permissions
dovrebbe essere 128
, perché
128 == 10000000
Che si tradurrebbe nello zero che ti aspetti.
Altri suggerimenti
127 == 1111111, 1 == 0000001
127 & 1 == 1
QED.