2016-11-22 46 views
1

我有一個先前由其他人建立的ACL系統,我想了解位掩碼如何在那裏工作。我已經這4個常數來定義:如何將十進制轉換爲位掩碼?

const NONE = 0; 
const READ = 1; 
const WRITE = 2; 
const UPDATE = 4; 
const DELETE = 8; 
在DB我看到用戶與像1的權限,2,5,9

然後,15我曾嘗試使用this tool轉化它們,我結束了這樣的結果:

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 

如何,我認爲這項工作如下:

Decimal Hexadecimal 
3   00000011 

因爲最後兩個位1我假設有這些用戶將擁有UPDATE|DELETE權限(請參閱上表)。是對的嗎?如果不是什麼是從十進制轉換爲位掩碼的正確方法?

+0

這只是基礎數學。例如。你得到的最低位以模2爲單位,並用/ 2移位一位,所以你可以看到2個常量的權重是通過重複設置的,直到你達到0爲止。 – maraca

+0

@maraca我不確定是否跟着你,例子將有助於 – ReynierPM

回答

1

0 = NONE是一個特殊的情況,可以通過簡單的比較來檢查。

如果你要問的問題是與2^(n-1)設定的值不變cn,那麼我們這樣做有(1 =是,0 =否,%=模):

(value/cn) % 2 

如果我們想要獲得設置的所有標誌,可以使用以下僞代碼執行此操作:

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

當然,它必須是整數除法才能工作,並且沒有浮點數(小數)。 – maraca

相關問題