Maschere di bit in Java

Maschere di bit in Java

Posted by gtrev on Mar, 02/01/2007 - 14:30 in

In questo articolo parlerò delle maschere di bit e di come gestirle semplicemente in Java.

Introduzione

Una maschera di bit altro non è che un numero binario nel quale ad ogni posizione viene associato un particolare significato.

Supponiamo di voler ad esempio gestire una serie di modalità di accesso ad un file, tipicamente:

  • lettura
  • scrittura
  • esecuzione

Usando una rappresentazione binaria potremmo quindi dire che:

  1. esecuzione = 00000001 (in decimale = 1)
  2. scrittura = 00000010 (in decimale = 2)
  3. lettura = 00000100 (in decimale = 4)

Recuperare il valore di un bit all'interno della maschera

Supponiamo di avere il file con i suoi permessi e di voler capire se tale file è eseguibile.

Per fare questo dobbiamo considerare la maschera di bit che rappresenta l'esecuzione (00000001) e porla in AND logico con la maschera di permessi del file.

infatti l'operazione di AND garantisce di ritornare uno nel primo bit solo quando entrambi i bit sono a 1, cioè quando il file ha il permesso di esecuzione.

Allo stesso modo potremmo controllare se il file è scrivibile ed eseguibile, in questo caso la maschera di bit con la quale fare il confronto è 00000011.

Un semplice metodo Java che compie questa operazione è il seguente:

public static int getMaskStatus(long mask, long mode) {
return ((mask & mode) == mode) ? 1 : 0;
}

Impostare (a 0 o a 1) un bit nella maschera

Supponiamo adesso di voler impostare un attributo nel nostro file, ovvero cambiare un permesso.

Per prima cosa proviamo a fare in modo che il nostro file sia eseguibile, cioè impostiamo a 1 il bit di esecuzione.

L'operazione che ci permette di fare ciò è l'OR logico. Infatti tale operatore ci garantisce di impostare il valore 1 quando almeno uno dei due operatori sia uno.

Tale operazione funziona correttamente sia che il file abbia o meno il bit di esescuzione già impostato.

Dobbiamo fare un po' più attenzione se vogliamo togliere un permesso al file.

In questo caso l'operazione da compiere è:

mask & (~modeLong)

Di seguito illustro il codice Java che compie entrambe le operazioni. Il metodo riceve in input anche l'intero valueToSet che potrà valere 0 o 1. Analizzando questo valore, verrà attivata l'operazione corrispondente:


public static long setMaskStatus(long mask, int valueToSet, long mode) {

if (valueToSet == 1) {// set
mask = mask | mode;
} else {// unset
mask = mask & (~mode);
}

return mask;
}

Le maschere di bit sono molto usate, pensate ad esempio al filesystem di Unix, chmod usa della logica simile a questa per impostare i permessi ai file.

Rimango sempre stupito di
Rimango sempre stupito di come la sintassi Java sia cosi' simile a quella del mio adorato C++...
Posted by era77 on Mar, 02/01/2007 - 15:03
Sei sempre polemico Volevo

Sei sempre polemico Laughing

Volevo invece ricevere qualche parere sul post, del tipo: "anche io faccio così", "no io uso quest'altro metodo", su dai non fate i timidi. Va bene anche se usate per spiegrvi anche qualche altro linguaggio di programmazione.

Posted by gtrev on Mer, 03/01/2007 - 14:29
Beh, credo che per quanto

Beh, credo che per quanto concerne il mascheramento dei bit non e' che ci siano tante strade da seguire... Io faccio come descritto in questo articolo...

Surprised

E non sono polemico

Yell

Posted by era77 on Mer, 03/01/2007 - 15:02
Invia nuovo commento
  • Linee e paragrafi vanno a capo automaticamente.
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.

Maggiori informazioni sulle opzioni di formattazione.