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
例: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了.
//发现了吗?正好是我们每个设置项对应的十进制数值:)
思路就是这样了,如果想同时操作多个位上的设置值也可以,就看你的操作数怎么设置了.