热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php位运算用法详细介绍_PHP教程

php位运算用法详细介绍。php位运算在php中不常用到,但作用是相当大的,下面我们来介绍一下php位运算用法。$a$band(按位与)$a|$bor(按位或)$a^$bXor(按位异或)
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了。
//发现了吗?正好是我们每个设置项对应的十进制数值:)

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

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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/629039.htmlTechArticlephp位运算在php中不常用到,但作用是相当大的,下面我们来介绍一下php位运算用法。 $a $b and(按位与) $a | $b or(按位或) $a ^ $b Xor(按位异或)...


推荐阅读
  • 本文详细介绍如何安装和配置DedeCMS的移动端站点,包括新版本安装、老版本升级、模板适配以及必要的代码修改,以确保移动站点的正常运行。 ... [详细]
  • 探讨了在HTML表单中使用元素代替进行表单提交的方法。 ... [详细]
  • JavaScript 跨域解决方案详解
    本文详细介绍了JavaScript在不同域之间进行数据传输或通信的技术,包括使用JSONP、修改document.domain、利用window.name以及HTML5的postMessage方法等跨域解决方案。 ... [详细]
  • 3DSMAX制作超现实的体育馆模型
    这篇教程是向脚本之家的朋友介绍3DSMAX制作超现实的体育馆模型方法,教程制作出来的体育馆模型非常地不错,不过教程有点难度,需要有一定基础的朋友学习,推荐到脚本之家,喜欢的朋友可 ... [详细]
  • 本文介绍了如何在AngularJS应用中使用ng-repeat指令创建可单独点击选中的列表项,并详细描述了实现这一功能的具体步骤和代码示例。 ... [详细]
  • 在项目冲刺的最后一天,团队专注于软件用户界面的细节优化,包括调整控件布局和字体设置,以确保界面的简洁性和用户友好性。 ... [详细]
  • JavaScript 页面卸载事件详解 (onunload)
    当用户从页面离开时(如关闭页面或刷新页面),会触发 onunload 事件,此时可以执行预设的脚本。需要注意的是,不同的浏览器对 onunload 事件的支持程度可能有所不同。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 过去我习惯使用百度空间来记录个人的生活琐事,但随着需求的增长,我发现它的功能略显不足,特别是在代码分享和图片管理方面存在诸多不便。因此,我决定寻找一个更适合技术分享的平台,最终选择了博客园。 ... [详细]
  • Linux系统中Boot分区空间不足的处理方案
    在Linux系统的默认安装过程中,Boot分区通常分配的空间为200MB左右,理论上这个大小足以满足日常需求。然而,随着系统的频繁更新,尤其是内核的不断升级,如果不及时清理过期的内核版本,Boot分区很容易出现空间不足的问题。 ... [详细]
  • 如何辨别华为手机的不同屏幕分辨率?
    了解华为手机屏幕分辨率的区别及其识别方法对于提升用户体验至关重要。本文将详细介绍如何通过手机设置中的显示选项来查看和区分不同型号华为手机的屏幕分辨率。 ... [详细]
  • 尽管在WPF中工作了一段时间,但在菜单控件的样式设置上遇到了一些基础问题,特别是关于如何正确配置前景色和背景色。 ... [详细]
  • ASP.NET 进度条实现详解
    本文介绍了如何在ASP.NET中使用HTML和JavaScript创建一个动态更新的进度条,并通过Default.aspx页面进行展示。 ... [详细]
  • Vue CLI 基础入门指南
    本文详细介绍了 Vue CLI 的基础使用方法,包括环境搭建、项目创建、常见配置及路由管理等内容,适合初学者快速掌握 Vue 开发环境。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
author-avatar
Damon
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有