php 位运算与权限,PHP中的二进制位运算和权限存储

在很多系统的权限/选项设置中 很多都用到了位运算的方法来存储多种标志位。这样可以节省字段。一个字段只需要一个数字 就可以标识很多种设置和信息。

举例 dicuz的帖子表的status字段,官方预留了16个标志位(0x0000 – 0xFFFF) 即216

目前规划使用了只有8个标志位,如下

0000 0000 0000 0001 是否缓存帖子位置信息

0000 0000 0000 0010 是否回帖只对管理人员和发帖者可见

0000 0000 0000 0100 是否抢楼贴

0000 0000 0000 1000 是否倒序查看回帖

0000 0000 0001 0000 是否存在主题图章标志位

0000 0000 0010 0000 回复是否通知作者

0000 0000 0100 0000 是否推送到QQ空间

0000 0000 1000 0000 是否推送到腾讯微博

这8种状态可以使用一个数字来同时表示,节省了字段

那么这种东西的原理是什么呢

这个我们可以复习一下的位运算单算法

例子

名称

结果

$a & $b

And(按位与)

将把 $a 和 $b 中都为 1 的位设为 1。

$a | $b

Or(按位或)

将把 $a 或者 $b 中为 1 的位设为 1。

$a ^ $b

Xor(按位异或)

将把 $a 和 $b 中不同的位设为 1。

~ $a

Not(按位非)

将 $a 中为 0 的位设为 1,反之亦然。

$a << $b

Shift left(左移)

将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。

$a >> $b

Shift right(右移)

将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

比如

与运算

14 = 0b1110

11 = 0b1011

那么 14 & 11  = 0b1110 & 0b1011 = 0b1010 = 10

或运算

还是上面那个例子

14 | 11 = 0b1110 | 0b1011 = 0b1111 = 15

异或运算

14 ^ 11 = 0b1110 ^ 0b1011 = 0b0101 = 5

非运算

非运算比较特殊 涉及到符号 这里要说一下补码 反码 原码的概念

1.二进制最高是符号位  0是正数  1表示负数

2.正数的 原码 反码  补码 都一样(我上面没有单独算补码的原因 ,正数补码和反码一样)

3.用二进制表示一个数  这个码 就是原码 比如 14的原码就是 1110

4.负数的反码 等于  他符号位不变 其他取反,而负数的补码等于他的反码+1

5.计算机运算的时候 全都是以补码的形式来运算的 不管正负数

那么

1 是正数,那么他的原码 0001 = 反码 = 补码 = 0001 =>取反 后补码1110 <=反码 1101<=原码1010

那么这个符号位是1就是负数 也就是010代表的负数就是-2 也就是 ~1 = -2

左右位移运算

1<< 2

1的补码    00000001

移动2位    00000100

正数的反码 补码  原码 都一样 所以 是个4

负数的计算过程相同 不再赘述 左移也类似 4>>2  就是1

其实可以理解为右移在十进制的表现上就是乘以2 左移 在十进制的表现上就是除以2

那么回到本文正题 如何用一个数字来标识这些权限位呢?

以刚才discuz的帖子表达status字段为例,检查帖子回复是否通知作者 就看二进制上第六位是否是置位为1 那么怎么检查呢?就是用上面我们提到的与运算。

与运算是将把 $a 和 $b 中都为 1 的位设为 1。那么假设

$a=36=0b 0010 0100

$b=0b 0010 0000

$a&$b = 0b 0010 0100 & 0b 0010 0000 = 0b 0010 0000 = 32 = 26-1 = 25

因此 检查,某个数代表的第N个权限标志位有没有置位(是1) 只要选择该数与仅该标志位置位的操作数2N-1进行与运算即可,相反要计算某个标志位被置位的数字 只要选择合适的操作数进行或运算即可。我们可以看discuz对此的实现:

function getstatus($status, $position) { $t = $status & pow(2, $position – 1) ? 1 : 0; return $t;}function setstatus($position, $value, $baseon = null) { $t = pow(2,$position – 1); if($value) { $t = $baseon | $t; } elseif ($baseon !== null) { $t = $baseon & ~$t; } else { $t = ~$t; } return $t & 0xFFFF;}

注意 写这段代码的人显然受到了C的影响 其实 $a & ~$b 和 $a ^ $b 是等效的 只不过 ^是PHP的写法 另外 pow(2, $position – 1)换成 1 << ($position -1) 其实更好理解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

腾讯视频app下载2019_腾讯视频主设备如何设置

很多人都使用腾讯视频&#xff0c;播放器家园网小编给大家分享一下腾讯视频app下载2019_腾讯视频主设备如何设置相关内容。腾讯视频的主界面资源分类最广&#xff0c;为用户提供最新、最热的电影、电视剧、综艺、动漫、体育等视频节目。腾讯视频播放器采用了智能的P2P流媒体播放…

php上传图片管理系统,php 登录操作的文件上传管理系统

[导读]本文章来给各位同学介绍一个不错的需要登录的php文件上传管理系统&#xff0c;功能简单有需要了解的同学可参考。 代码如下复制代码 本文章来给各位同学介绍一个不错的需要登录的php文件上传管理系统&#xff0c;功能简单有需要了解的同学可参考。代码如下复制代码$admin…

手机pptv如何切换视频和音频

很多人都使用pptv播放器&#xff0c;播放器家园网小编给大家分享一下手机pptv如何切换视频和音频相关内容。pptv播放器是pptv播放器旗下一款高清视频客户端&#xff0c;pptv播放器可提供高清海量影视视频在线观看和下载海量正版高清-影视资源&#xff0c;可供用户飞速离线观看&…

iis7.5 php伪静态,Windows Server 2008 下WordPress IIS7.5伪静态规则设置(最新)

解决地址栏中tag标签不正常实现目的&#xff1a;配置WordPress伪静态具体操作&#xff1a;一、确认IIS 7.5是否安装IIS URL Rewrite打开&#xff1a;控制面板\系统和安全\管理工具\Internet Information Services (IIS)管理器看到URL重写&#xff0c;说明已经安装了IS URL Rewr…

腾讯视频下载安装免费2020_腾讯视频app的哪里发贴

本文播放器家园网给大家整理了腾讯视频下载安装免费2020_腾讯视频app的哪里发贴子的方面的内容。腾讯视频是一款可以电影资源非常丰富的播放器软件&#xff0c;用户可以在这里观看各种有趣的电影&#xff0c;每天都有精彩的影视资源分享给大家&#xff0c;让更多的用户可以享受…

php需要什么技能,PHP初学者必备的技能

PHP初学者必备的技能初学PHP时&#xff0c;不要好高骛远&#xff0c;脚踏实地的把LNMP搞熟练&#xff0c;打好基础再往更高的层次发展。下面是小编分享的PHP初学者必备的技能&#xff0c;欢迎大家参考!1.Linux基本命令、操作、启动、基本服务配置(包括rpm安装文件&#xff0c;各…

ie浏览器安全使用网银支付功能方法

ie浏览器安全使用网银支付功能方法 ie浏览器怎么安全使用网银支付功能?每次使用我们在使用网银支付时&#xff0c;我们如果不放心自己银行卡的安全。我们在每次支付时候可以选择”清除SSL状态” 清除SSL状态方法为&#xff1a; 第一&#xff0c;打开IE浏览器&#xff0c;点击…

java gc时会暂停运行吗,java gc 项目终止运行

当前位置:我的异常网 编程 java gc 项目终止运行java gc 项目终止运行www.myexceptions.net 网友分享于&#xff1a;2013-09-03 浏览&#xff1a;6次java gc 项目停止运行首先感谢阿宝同学的帮助&#xff0c;我才对这个gc算法的调整有了一定的认识&#xff0c;而不是停留在过…

Chrome谷歌浏览器76地址栏隐藏的HTTPS和WWW标记如何恢复

Chrome谷歌浏览器76地址栏隐藏的HTTPS和WWW标记如何恢复 几天前正式推出的谷歌Chrome 76版本带来了许多新的特性和改进&#xff0c;但是也有一些相当有争议的变化。谷歌决定默认隐藏浏览器地址栏中的HTTPS和WWWS标记&#xff0c;以增强“UI界面的简洁性&#xff0c;可用性和安全…

最新版chrome 70浏览器同步、清除Cookie设置将更改

最新版chrome 70浏览器同步、清除Cookie设置将更改 谷歌在最新的Chrome 69浏览器中引入了一项改动&#xff0c;用户在浏览器上登录任何谷歌旗下的服务时&#xff0c;也将同时在浏览器登录自己的谷歌账号。此举受到了一些质疑。昨日谷歌对此进行回应&#xff0c;宣布将对这一设…

php 取消页面一些样式,jquery如何去除样式

jquery去除样式的方法&#xff1a;1、使用【removeClass()】方法&#xff0c;代码为【removeClass(function(index,class))】&#xff1b;2、使用toggleClass方法&#xff0c;代码为【toggleClass(class)】。本教程操作环境&#xff1a;windows7系统、jquery3.2.1版&#xff0c…

谷歌将停止对32位Linux系统Chrome浏览器支持

谷歌将停止对32位Linux系统chrome浏览器支持 今天&#xff0c;谷歌宣布自2016年3月上旬开始将不再为部分GNU/Linux操作系统继续提供32位Chrome浏览器的DEB安装包。来自Chromium-dev开发团队的工程师Dirk Pranke在 谷歌线上社区中向Ubuntu 和Debian GNU/Linux分支版本的用户发出…

matlab对经济指标分析,经济背景下的数据预测分析--基于matlab建模(郑铿城)

1、经济预测概述经济预测有三个要素&#xff0c;实际资料是预测的依据&#xff1b;经济理论是预测的基础&#xff1b;数学模型是预测的手段&#xff1b;经济预测的内容包括生产和资源预测&#xff0c;市场预测&#xff0c;国民收入分配预测&#xff0c;居民生活质量预测等。预测…

腾讯视频下载位置_腾讯视频怎么下视频到手机

很多人都使用腾讯视频&#xff0c;播放器家园网小编给大家分享一下腾讯视频下载位置_腾讯视频怎么下视频到手机相关内容。作为国内首家&#xff0c;全力打造正版视频平台的腾讯视频&#xff0c;将从流畅的观映体验、高清的视觉效果、贴心的分享感受等多个方面将“品质”做到极致…

腾讯视频客服在哪找 如何联系腾讯视频人工客服2019

腾讯视频客服在哪找?当你在腾讯视频里遇到问题的时候&#xff0c;一定想要找到人工客服解决问题&#xff0c;那么&#xff0c;腾讯视频客服在哪个位置&#xff0c;如何联系呢?让我们一起来看看本文提供的操作吧! 视频播放器 腾讯视频客服在哪找 第一步打开腾讯视频&#xf…

matlab读取suffer,MATLAB调用surfer时出错

我现在用的是MATLAB2018b&#xff0c;调用的是surfer13.MATLAB和surfer安装在D盘的program里。程序如下&#xff1a;%% 调用surfer绘制散点图%启动surfersrf actxserver(Surfer13.application);%% 设置surfer相关参数set(srf,visible,1); %设置窗口可见PathD:\Program Files…

腾讯视频app官方下载_腾讯视频怎么快进

腾讯视频pc端和手机端都支持通过频道推荐、观看历史、加入看单、搜索功能快速找到想看的视频。腾讯视频客户端支持边下载边观看、云同步记录等贴心功能&#xff0c;腾讯视频给您带来更高品质享受。腾讯视频播放器精致小巧且免费无广告无第三方插件&#xff0c;无条件延续腾讯视…

matlab矢量角度,MATLAB矢量,角度,图

我为这个含糊不清的标题道歉,但我并不完全确定如何用这句话来表达.所以忍受我.我有一个数据矩阵.每列和每行代表某个向量(第1列第1行,第2列第2行等),每个单元格值是相应向量之间的余弦相似度.所以矩阵中的每个值都是余弦.我想对此做几件事.首先,我想创建一个显示其上所有向量的…

优酷视频如何登录优酷账号?

你好&#xff0c;优酷适用手机上&#xff0c;电子邮箱及其淘宝网、支付宝钱包等多种多样付款方式&#xff0c;请能够 参照下列方式登陆。 1.网页端您能够 点一下登陆&#xff0c;键入优酷账户及登陆密码就可以。视频播放器 假如您是第三方登录的能够 挑选登陆后&#xff0c;选…

java int比较用==,整数-在Java中使用==运算符比较包装对象

根据jls-5.1.7If the value p being boxed is true, false, a byte, or a char in the range \u0000 to \u007f,or an int or short number between -128 and 127 (inclusive), then let r1 and r2be the results of any two boxing conversions of p. It is always the case t…