2011-09-19 57 views
1

許可「位」我正與使用以下的許可方案的系統工作:Effeciently發現在數量

1 - 權限甲

2 - 權限乙

4 - 權限Ç

8 - 權限d

16 - 權限Ë

用戶的權限被存儲爲權限值的總和。例如,如果用戶具有權限B,C和D,則14是存儲的號碼。 (2 + 4 + 8)

是否有一種快速方法來確定用戶是否具有權限D,該權限不涉及權限字符串的完整擴展? (取2的冪直到大於存儲的數字,減去該功率,直到達到目標數字)

回答

0

看一看bitwise operators

+0

我以爲有這樣的事情我可以做,但我不明白如何將這些應用於我的特定問題。 OMG! – Jeffrey

2

,最快的方式是做位運算:

$D_PERMISSION = 0x08 
if($permission & $D_PERMISSION) { do_stuff(); } 
-1
////////////////////////////////////////////////////////////////////////// 
// LONGINT_DEC2BIN 
// 64-bit manipulation safe even on 32-bit systems 
// $dec_str is a DECIMAL integer or a string of decimal digits 
// returns binary looking string with 0's and 1's 
////////////////////////////////////////////////////////////////////////// 
function longint_Dec2Bin($dec_str) { 
    if(longint_is_32()) { 
     $dec_str .= ''; // convert to string if not already 
     $bin_str=''; 
     while($dec_str!='0') { 
      $bin_str .= chr(48 + ($dec_str{strlen($dec_str)-1}%2)); 
      if(function_exists('BCDiv')) { 
       $dec_str = BCDiv($dec_str,'2'); 
      } elseif(function_exists('gmp_div_q')) { 
       $dec_str = gmp_strval(gmp_div_q($dec_str,'2')); 
      } else { 
       die("This PHP installation lacks both BCMath and GMP. 32-bit environments like this require one or the other."); 
      } 
     } 
     $bin_str=strrev($bin_str); 
     return(($bin_str!='')?$bin_str:'0'); 
    } else { 
     return decbin($dec_str); 
    } 
} 
+0

這是按位操作的非常複雜的選擇! – Yousf

+0

同意。如果32位處理器可以執行64位操作,則不需要。 – Charlie