What does & in &2 mean in PHP?

In the last line of the following code, it has &2, if($page['special']&2).

What does & mean?

if(isset($_REQUEST['id']))$id=(int)$_REQUEST['id'];
else $id=0;
if($id){ // check that page exists
    $page=dbRow("SELECT * FROM pages WHERE id=$id");
    if($page!==false){
        $page_vars=json_decode($page['vars'],true);
        $edit=true;
    }
}
if(!isset($edit)){
    $parent=isset($_REQUEST['parent'])?(int)$_REQUEST['parent']:0;
    $special=0;
    if(isset($_REQUEST['hidden']))$special+=2;
    $page=array('parent'=>$parent,'type'=>'0','body'=>'','name'=>'','title'=>'','ord'=>0,'description'=>'','id'=>0,'keywords'=>'','special'=>$special,'template'=>'');
    $page_vars=array();
    $id=0;
    $edit=false;
}

// { if page is hidden from navigation, show a message saying that
if($page['special']&2)echo '<em>NOTE: this page is currently hidden from the front-end navigation. Use the "Advanced Options" to un-hide it.</em>';

$page['special'] & 2

means

$page['special'] bitwise AND 2

It basically checks to see if the 2 bit is set in $page['special'] .

This line:

if(isset($_REQUEST['hidden']))$special+=2;

explicitly adds 2 to $special so that it'll satisfy the bitwise AND operation and comparison, because decimal 2 == binary 10, with the 1 representing the 21 bit, ensuring it is set.

The AND operation returns 2 if the 2 bit is set, which resolves to true in PHP and satisfies the condition; otherwise it returns 0 which is considered false .

Quite a neat trick IMO, not sure how secure it is though.


& is the bitwise AND operator. The result of a & b are the bits that are equal in a and b .

So in this case $page['special']&2 returns either 0 or 2 depending on the bit pattern of $page['special'] :

  **** **** **** **** **** **** **** **X*    // $page['special']
& 0000 0000 0000 0000 0000 0000 0000 0010    // 2
=========================================
  0000 0000 0000 0000 0000 0000 0000 00X0    // $page['special'] & 2

It's the bitwise and operator.

It looks like it's using that particular bit to hide the page.

In case you don't know what the bitwise operator is, consider the value 74 in binary:

0100 1010

If you and this with 2 ( 0000 0010 ), you get:

0100 1010
0000 0010
---- ----
0000 0010

or a non-zero (true) value.

The lines:

$special=0;
if(isset($_REQUEST['hidden']))$special+=2;

are setting that bit based on the hidden key.

链接地址: http://www.djcxy.com/p/1704.html

上一篇: 什么时候应该使用按位运算符?

下一篇: &in&2在PHP中意味着什么?