php位运算用法详细介绍

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了.

//发现了吗?正好是我们每个设置项对应的十进制数值:)

思路就是这样了,如果想同时操作多个位上的设置值也可以,就看你的操作数怎么设置了.

以后开发中遇到需要一个参数同时设置多个选项的情况时我们就可以考虑一下这个方法了:)

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...