php教程|php手册
php,位运算
php教程-php手册
php位运算在php中不常用到,但作用是相当大的,下面我们来介绍一下php位运算用法.
php网站源码结构,恢复ubuntu终端设置,服务器端重启tomcat,早皮上有爬虫,钉钉健康打卡php设计前端,seo22813lzw
$a & $b and(按位与)
直播网站源码下载,vscode界面不显示,ubuntu 硬盘挂起,iis tomcat80,爬虫web,php loading,宁波seo哪家质量好,定制珠宝 网站源码,jsp网页模板 下载lzw
$a | $b or(按位或)
小柯秒赞平台网站源码,ubuntu配置uboot,1万并发多少tomcat,线上爬虫店,php filters,seo实战技巧100例推广引流lzw
$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 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 constant1 E_ERROR2 E_WARNING4 E_PARSE8 E_NOTICE16 E_CORE_ERROR32 E_CORE_WARNING64 E_COMPILE_ERROR128 E_COMPILE_WARNING256 E_USER_ERROR512 E_USER_WARNING1024 E_USER_NOTICE2047 E_ALL2048 E_STRICT4096 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_PARSEif($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了.
//发现了吗?正好是我们每个设置项对应的十进制数值:)
思路就是这样了,如果想同时操作多个位上的设置值也可以,就看你的操作数怎么设置了.
以后开发中遇到需要一个参数同时设置多个选项的情况时我们就可以考虑一下这个方法了:)