2016-11-22 2 views
1

Ich habe ein ACL-System zuvor von jemand anderem gebaut und ich versuche zu verstehen, wie Bit-Maskierung dort funktioniert. Ich habe diese vier Konstanten definiert:Wie übersetzt man von Dezimal zu Bitmaske?

const NONE = 0; 
const READ = 1; 
const WRITE = 2; 
const UPDATE = 4; 
const DELETE = 8; 

Dann in DB I Benutzer wie 1 mit Berechtigungen sehen, 2, 5, 9, 15. Ich habe versucht, sie zu verwandeln this tool mit und ich mit diesem Ergebnis am Ende:

0 // NONE 
1 // READ 
2 // WRITE 
3 // UPDATE|DELETE 
4 // UPDATE 
5 // WRITE|DELETE 
6 // WRITE|UPDATE 
7 // WRITE|UPDATE|DELETE 
8 // DELETE 
9 // READ|DELETE 
10 // READ|UPDATE 
11 // READ|UPDATE|DELETE 
12 // READ|WRITE 
13 // READ|WRITE|DELETE 
14 // READ|WRITE|UPDATE 
15 // READ|WRITE|DELETE|UPDATE 

wie ich diese Arbeit denken, ist wie folgt:

Decimal Hexadecimal 
3   00000011 

da die beiden letzten Bits 1 sind ich gehe davon aus, dass die Benutzer mit 3 wird über UPDATE|DELETE Berechtigungen verfügen (siehe Tabelle oben). Ist das richtig? Wenn nicht, was ist der richtige Weg, um von Dezimal zu Bitmaske zu übersetzen?

+0

Es ist nur grundlegende Mathematik. Z.B. Du bekommst das niedrigste Bit mit Modulo 2 und verschiebst um ein Bit mit/2, also siehst du, welche Potenzen von 2 (Konstanten) gesetzt sind, bis du 0 erreichst. – maraca

+0

@maraca Ich bin mir nicht sicher, dir zu folgen, ein Beispiel würde helfen – ReynierPM

Antwort

1

0 = NONE ist ein Spezialfall, der durch einfachen Vergleich überprüft werden kann.

Wenn Sie die Frage stellen wollen, ist konstant cn mit dem Wert von 2^(n-1) gesetzt, dann tun wir dies mit (1 = ja, 0 = nein,% = Modulo):

(value/cn) % 2 

Wenn wir wollen, Um alle gesetzten Flags zu erhalten, können Sie das mit dem folgenden Pseudocode tun:

c := 1 
while value > 0 
    if value % 2 = 1 
     // constant c is set 
     ... 
    end if 
    value := value/2 
    c := c * 2 
end while 
+0

Natürlich muss alles integer Division sein, damit dies funktioniert und keine Fließkomma (dezimal) Zahlen. – maraca

Verwandte Themen