例付きのPHPビット演算

PHPでの重大なエラーの処理に関する記事に触発されました。 PHPのエラーコードはビット操作のために特別に強化されているにもかかわらず、記事の例とコメントでは、エラーコードのチェックに通常の比較演算子が使用されていることに気付きました。



たとえば、次のようなオプションがありました。

if ($error['type'] == E_ERROR || $error['type'] == E_PARSE || $error['type'] == E_COMPILE_ERROR){…}
      
      





if(in_array($error['type'], array(E_ERROR, E_PARSE,  E_COMPILE_ERROR)) {…}
      
      





.





() . , , ().

5 , 00000101.



6 :



$a & $b — ( , $a $b)

$a | $b — ( , $a $b)

$a ^ $b — ( $a $b, )

~$a — (, 1 0, )

$a << $b — ( $a $b)

$a >> $b — ( $a $b)





, .

: , , , . 4 , 4- , 1 — , , 0 — . .







:



define('U_READ', 1 << 0);   // 0001
define('U_CREATE', 1 << 1); // 0010
define('U_EDIT', 1 << 2);   // 0100
define('U_DELETE', 1 << 3); // 1000
define('U_ALL', U_READ | U_CREATE | U_EDIT | U_DELETE); // 1111
      
      







.

$user_perm =  U_READ; //   
      
      





.

$user_perm =  U_READ | U_DELETE; //    
      
      





.

$user_perm =  U_ALL; //  
      
      





, .

$user_perm =  U_ALL ^ U_DELETE;  //     
$user_perm =  U_ALL & ~ U_DELETE; //     ,    2 
      
      





, , 1, 0, . 0, .





, , .. . .

if($user_perm & U_READ) //    ?
      
      





,

if($user_perm & ( U_READ | U_DELETE )) //     / 
      
      







- ,

$user_perm &= ~ U_DELETE; //  
      
      







. , :

if($error['type'] & ( E_ERROR | E_PARSE | E_COMPILE_ERROR )) {…}
      
      







P.S.: , , PHP.

:

Wikipedia

PHP



All Articles