2012-09-27 62 views
4

我使用按位運算來表示一個整數內的許多訪問控制標誌。在> 32位整數上使用按位運算符

ADMIN_ACCESS = 1; 
EDIT_ACCOUNT_ACCESS = 2; 
EDIT_ORDER_ACCESS = 4; 

var myAccess = 3; // ie: (ADMIN_ACCESS | EDIT_ACCOUNT_ACCESS) 

if (myAccess & EDIT_ACCOUNT_ACCESS) { // check for correct access 
    // allow for editing of account 

} 

這大部分發生在我項目的PHP端。然而,在保存某人的訪問級別時,使用Javascript可以使用|加入多個訪問標誌。這很好地工作到一個點。我發現一旦整數(標誌)變得太大(> 32位),它就不再能夠在Javascript中按位運算符正常工作。例如:

alert(4294967296 | 1); // equals 1, but should equal 4294967297 

我試圖找到一種解決方法,這樣我就不必我訪問控制標誌的次數限制爲32。每個接入控制標誌是兩次先前控制標誌,使每個控制標誌不會干擾其他控制標誌。

dec(4) = bin(100) 
dec(8) = bin(1000) 
dec(16) = bin(10000) 

我注意到,有一個簡單的+增加了兩個這樣的標誌在一起時,似乎拿出了同樣的答案當作位or操作,但我有麻煩纏繞我的頭左右,這是否是一個簡單的替換,或者如果這樣做可能會有問題。任何人都可以評論此解決方法的有效性嗎?例如:

(4294967296 | 262144 | 524288) == (4294967296 + 262144 + 524288) 

回答

2

簡單地增加將工作提供了你肯定知道每個標誌是兩個電源,並且您不過去的52位長(由於量去標誌一個Double-precision float能持有,因爲這是JS用於數字的)。

如果無論出於何種原因需要超過52個標誌,我建議將這些標誌分組。

2

如果要進行按位運算,則不能超過32個。爲了執行按位操作,javascript將數字值(它保存爲8字節浮點數)轉換爲32位整數,然後對該值執行按位/位移操作。它將結果整數轉換回浮點值,然後存儲到變量中。欲瞭解更多信息,請參閱此Moz Dev Net article

您仍然可以對浮點數執行整數運算,最大值爲9007199254740992,即2^53。但由於上述原因,不能使用超過32位的按位運算符。

由於PHP使用與平臺相關的整數,因此您無法保證PHP可以處理多於32位的數據。所以在雙方我都會建議將旗幟分組並分開保存。你可以用訪問器將它們包裝在對象中,以確保它們像一組標誌而不是幾個標誌。