php位運算在php中不常用到,但作用是相當大的,下面我們來介紹一下php位運算用法。
$a & $b and(按位與)
$a | $b or(按位或)
$a ^ $b Xor(按位異或)
~$a Not(按位非)
$a << $b Shift left(左移)
$a >> $b Shift right(右移)
詳解
$a & $b 按位與 把$a和$b中都為1的位設為1;
例:10 & 12 = 8
10 1010
12 1100
1000 8
$a | $b 按位或 把$a或$b中有一個為1的為設為1;
例:10 | 12 = 14
10 1010
12 1100
1110 14
$a ^ $b 按位異或
例:10 ^ 12
10 1010
12 1100
0110 6
~a 按位非 把$a中的為0的為設為1,1的為設為0
例:~10 =
10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的為向左移動$b次(每一次移動都表示乘以2);
例:1 << 10 = 1024
1(1) 左移10位 10000000000(1024)
相當於1*2的10次方,php中沒有冪運算真是郁悶。
$a >> $b 右移 把$a中的為向右移動$b次(每一次移動都表示除以2);
例:1024 << 2 = 1256
10000000000(1024) 右移2位就是 100000000(256)
php為運算$a & $b and(按位與)$a | $b or(按位或)$a ^ $b Xor(按位異或)~$a Not(按位非)$a << $b Shift left(左移)$a >> $b Shift right(右移)
詳解$a & $b 按位與 把$a和$b中都為1的位設為1;例:10 & 12 = 810 101012 1100 1000 8
$a | $b 按位或 把$a或$b中有一個為1的為設為1;例:10 | 12 = 1410 101012 1100 1110 14
$a ^ $b 按位異或例:10 ^ 1210 101012 1100 0110 6
~a 按位非 把$a中的為0的為設為1,1的為設為0例:~10 = 10 1010 1111111111111111111111111111111111111111111111111111111111110101 -11
$a << $b 左移 把$a中的為向左移動$b次(每一次移動都表示乘以2);例:1 << 10 = 10241(1) 左移10位 10000000000(1024)相當於1*2的10次方,php中沒有冪運算真是郁悶。
$a >> $b 右移 把$a中的為向右移動$b次(每一次移動都表示除以2);例:1024 << 2 = 125610000000000(1024) 右移2位就是 100000000(256)
標志位字段與位運算符的結合
PHP裡的error_reporting的參數值列表
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
發現value的值都是跳躍式的吧,而且全是2的n+1次方.
再看下面這個。把value的值轉成二進制了。
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
.
.
.
… …一次為每加一次方就是二進制加了一位(學過計算機的差不多都知道:)…)
注意:每個選項對應了一位(1為開啟 0為關閉)
好了,下面我們看看這麼設置參數的好處。
舉三個參數為例來看是什麼效果吧
error_reporting(3);//decbin(3) == 0000 0011; (相當於設置 E_WARNING 和 E_ERROR )
error_reporting(4);//decbin(4) == 0000 0100;(相當於設置 E_PARSE )
error_reporting(5);//decbin(5) == 0000 0101;(相當於設置 E_PARSE 和 E_ERROR)
獲取設置:
要看某項是否開啟的判斷可以用位運算來獲得(& — “與”規則 全1為1,否則為0)
//E_PARSE
if($n & 4){
//E_PARSE開啟
//4的二進制是 0100,因為只有第3位是1,所以進行”&”操作時其它何位置全被置0了
//因此只有$n的第三位也是1時結果才會大於0。
//如4(0100),5(0101),6(0110),7(0111)
}else{
//E_PARSE關閉
//第三位為0了就代表此選項是關閉狀態
}
改變設置:($n代表當前的十進制值)
在應用時我們可能跟據需要針對某位進行開關設置。
看下面的用法。
//關閉E_PARSE項 用 ‘&’“與”規則
$n = $n&(8192-4-1);
//為什麼用8191呢?
//這和你的選項數有關系,這個錯誤顯示標記一共用了13位(4096的二進制是13位),而8192是(14位).
//為什麼減4減1呢?
//8192-4-1=8187。(1111111111011)二進制是13位了,與我們用到的最大位數一樣了。而且對應的第三位上的值是0了。
//用這個數去和1到4096之間任何一個數按位“與”運算,是不是除了第三位會置0,其它位上的值不會變化呢? ”與”規則 :)
//同理,想關掉 E_WARNING
//$n = $n&(8192-2-1);
//開啟E_PARSE項用到‘|’“或”規則
$n = $n|4;
//看了上面的關閉,對於開啟有點想法兒了吧:)
// ‘|’ — “或”規則 有1為1 否則為0
//上面是所有位為1的情況下不影響其它位,現在則變成所有位為0的情況下不會影響其它位了:)
//所以我們只要把後面的操作數的二進制位相應的值置1,其它所有位置0就OK了。
//發現了嗎?正好是我們每個設置項對應的十進制數值:)
思路就是這樣了,如果想同時操作多個位上的設置值也可以,就看你的操作數怎麼設置了。
以後開發中遇到需要一個參數同時設置多個選項的情況時我們就可以考慮一下這個方法了:)