php位運(yùn)算在php中不常用到,但作用是相當(dāng)大的,下面我們來(lái)介紹一下php位運(yùn)算用法.
$a & $b and(按位與)
$a | $b or(按位或)
$a ^ $b Xor(按位異或)
~$a Not(按位非)
$a << $b Shift left(左移)
$a >> $b Shift right(右移)
詳解
$a & $b 按位與 把$a和$b中都為1的位設(shè)為1;
例:10 & 12 = 8
10 1010
12 1100
1000 8
例:10 | 12 = 14
10 1010
12 1100
1110 14
$a ^ $b 按位異或
例:10 ^ 12
10 1010
12 1100
0110 6
~a 按位非 把$a中的為0的為設(shè)為1,1的為設(shè)為0
例:~10 =
10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的為向左移動(dòng)$b次(每一次移動(dòng)都表示乘以2);
例:1 << 10 = 1024
1(1) 左移10位 10000000000(1024)
相當(dāng)于1*2的10次方,php中沒(méi)有冪運(yùn)算真是郁悶.
$a >> $b 右移 把$a中的為向右移動(dòng)$b次(每一次移動(dòng)都表示除以2);
例:1024 << 2 = 1256
10000000000(1024) 右移2位就是 100000000(256)
php為運(yùn)算$a & $b and(按位與)$a | $b or(按位或)$a ^ $b Xor(按位異或)~$a Not(按位非)$a << $b Shift left(左移)$a >> $b Shift right(右移)
詳解$a & $b 按位與 把$a和$b中都為1的位設(shè)為1;例:10 & 12 = 810 101012 1100 1000 8
$a | $b 按位或 把$a或$b中有一個(gè)為1的為設(shè)為1;例:10 | 12 = 1410 101012 1100 1110 14
$a ^ $b 按位異或例:10 ^ 1210 101012 1100 0110 6
~a 按位非 把$a中的為0的為設(shè)為1,1的為設(shè)為0例:~10 = 10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的為向左移動(dòng)$b次(每一次移動(dòng)都表示乘以2);例:1 << 10 = 10241(1) 左移10位 10000000000(1024)相當(dāng)于1*2的10次方,php中沒(méi)有冪運(yùn)算真是郁悶.
$a >> $b 右移 把$a中的為向右移動(dòng)$b次(每一次移動(dòng)都表示除以2);例:1024 << 2 = 125610000000000(1024) 右移2位就是 100000000(256)
標(biāo)志位字段與位運(yùn)算符的結(jié)合
PHP里的error_reporting的參數(shù)值列表
value constant
1 E_ERROR
2 E_WARNING
4 E_PARSE
8 E_NOTICE
16 E_CORE_ERROR
32 E_CORE_WARNING
64 E_COMPILE_ERROR
128 E_COMPILE_WARNING
256 E_USER_ERROR
512 E_USER_WARNING
1024 E_USER_NOTICE
2047 E_ALL
2048 E_STRICT
4096 E_RECOVERABLE_ERROR
發(fā)現(xiàn)value的值都是跳躍式的吧,而且全是2的n+1次方.
再看下面這個(gè).把value的值轉(zhuǎn)成二進(jìn)制了.
value constant
0000 0001 E_ERROR
0000 0010 E_WARNING
0000 0100 E_PARSE
0000 1000 E_NOTICE
0001 0000 E_CORE_ERROR
0010 0000 E_CORE_WARNING.
… …一次為每加一次方就是二進(jìn)制加了一位(學(xué)過(guò)計(jì)算機(jī)的差不多都知道:)…)
注意:每個(gè)選項(xiàng)對(duì)應(yīng)了一位(1為開(kāi)啟 0為關(guān)閉)
好了,下面我們看看這么設(shè)置參數(shù)的好處.
舉三個(gè)參數(shù)為例來(lái)看是什么效果吧
error_reporting(3);//decbin(3) == 0000 0011; (相當(dāng)于設(shè)置 E_WARNING 和 E_ERROR )
error_reporting(4);//decbin(4) == 0000 0100;(相當(dāng)于設(shè)置 E_PARSE )
error_reporting(5);//decbin(5) == 0000 0101;(相當(dāng)于設(shè)置 E_PARSE 和 E_ERROR)
獲取設(shè)置:
要看某項(xiàng)是否開(kāi)啟的判斷可以用位運(yùn)算來(lái)獲得(& — “與”規(guī)則 全1為1,否則為0)
//E_PARSE
if($n & 4){
//E_PARSE開(kāi)啟
//4的二進(jìn)制是 0100,因?yàn)橹挥械?位是1,所以進(jìn)行”&”操作時(shí)其它何位置全被置0了
//因此只有$n的第三位也是1時(shí)結(jié)果才會(huì)大于0.
//如4(0100),5(0101),6(0110),7(0111)
}else{
//E_PARSE關(guān)閉
//第三位為0了就代表此選項(xiàng)是關(guān)閉狀態(tài)
改變?cè)O(shè)置:($n代表當(dāng)前的十進(jìn)制值)
在應(yīng)用時(shí)我們可能跟據(jù)需要針對(duì)某位進(jìn)行開(kāi)關(guān)設(shè)置.
看下面的用法.
//關(guān)閉E_PARSE項(xiàng) 用 ‘&’“與”規(guī)則
$n = $n&(8192-4-1);
//為什么用8191呢?
//這和你的選項(xiàng)數(shù)有關(guān)系,這個(gè)錯(cuò)誤顯示標(biāo)記一共用了13位(4096的二進(jìn)制是13位),而8192是(14位).
//為什么減4減1呢?
//8192-4-1=8187.(1111111111011)二進(jìn)制是13位了,與我們用到的最大位數(shù)一樣了.而且對(duì)應(yīng)的第三位上的值是0了.
//用這個(gè)數(shù)去和1到4096之間任何一個(gè)數(shù)按位“與”運(yùn)算,是不是除了第三位會(huì)置0,其它位上的值不會(huì)變化呢? ”與”規(guī)則 :)
//同理,想關(guān)掉 E_WARNING
//$n = $n&(8192-2-1);
//開(kāi)啟E_PARSE項(xiàng)用到‘|’“或”規(guī)則
//$n = $n|4;
//看了上面的關(guān)閉,對(duì)于開(kāi)啟有點(diǎn)想法兒了吧:)
// ‘|’ — “或”規(guī)則 有1為1 否則為0
//上面是所有位為1的情況下不影響其它位,現(xiàn)在則變成所有位為0的情況下不會(huì)影響其它位了:)
//所以我們只要把后面的操作數(shù)的二進(jìn)制位相應(yīng)的值置1,其它所有位置0就OK了.
//發(fā)現(xiàn)了嗎?正好是我們每個(gè)設(shè)置項(xiàng)對(duì)應(yīng)的十進(jìn)制數(shù)值:)
思路就是這樣了,如果想同時(shí)操作多個(gè)位上的設(shè)置值也可以,就看你的操作數(shù)怎么設(shè)置了.
以后開(kāi)發(fā)中遇到需要一個(gè)參數(shù)同時(shí)設(shè)置多個(gè)選項(xiàng)的情況時(shí)我們就可以考慮一下這個(gè)方法了:)