php位运算重要吗,PHP位运算的用途

下面为大家带来一篇PHP位运算的用途。现在就分享给大家,也给大家做个参考。一起过来看看吧

在实际应用中可以做用户权限的应用

我这里说到的权限管理办法是一个普遍采用的方法,主要是使用到”位运行符”操作,& 位与运算符、| 位或运行符。参与运算的如果是10进制数,则会被转换至2进制数参与运算,然后计算结果会再转换为10进制数输出。

它的权限值是这样的

2^0=1,相应2进数为”0001″(在这里^我表示成”次方”,即:2的0次方,下同)

2^1=2,相应2进数为”0010″

2^2=4,相应2进数为”0100″

2^3=8,相应2进数为”1000″

要判断一个数在某些数范围内就可以使用 & 运算符(数值从上面的表中得来)

如:7=4|2|1 (你也可以简单理解成7=4+2+1)

用 & 来操作,可以知道7&4、7&2、7&1都是真的,而如果7&8则是假的

&、| 不熟悉的就要去查查手册,看看是怎么用的了

下面来看例子吧:

// 赋予权限值-->删除:8、上传:4、写入:2、只读:1

define(“mDELETE”,8);

define(“mUPLOAD”,4);

define(“mWRITE”,2);

define(“mREAD”,1);

//vvvvvvvvvvvvv使用说明vvvvvvvvvvvvv

//部门经理的权限为(假设它拥有此部门的所有权限),| 是位或运行符,不熟悉的就查查资料

echo mDELETE|mUPLOAD|mWRITE|mREAD ,”

“;// 相当于是把上面的权限值加起来:8+4+2+1=15

// 设我只有 upload 和 read 权限,则

echo mUPLOAD|mREAD ,”

“;//相当于是把上传、只读的权限值分别相加:4+1=5

/*

*赋予它多个权限就分别取得权限值相加,又比如某位员工拥有除了删除外的权限其余都拥有,那它的权限值是多少?

*应该是:4+2+1=7

*明白了怎么赋值给权限吧?

*/

//^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

//判断某人的权限可用,设权限值在$key中

/*

*判断权限用&位与符,

*/

$key = 13;//13=8+4+1

if($key & mDELETE) echo “有删除权限

“; //8

if($key & mUPLOAD) echo “有上传权限

“; //4

$a=$key & mWRITE; echo “有写权限

“.$a; //无此权限

if($key & mREAD) echo “有读权限

“; //1

?>

OK,权限分值的这其中一个算法就是这样的,可以说是简单高效。也不知大家明白没有,不明白也没关系,记住例子就行了。前提就是做好权限值的分布,即那个1、2、4、8、16….(这里还有个顺序问题,越高级的权限就要越高的权限值,比如上面的例子所演示的删除权限)。有了权限分布表就可以确定给某个人什么权限了,你简单的理解成要哪个权限就加上相应的权限值吧。

这个方法很好用的,缺点就是如果权限分布得细的话,那么权限值会越来越大,你自己想想,2的几次方、如果所有的权限都要则是全部相加。不过对于一般的权限来说这个已经足够了。

下面是些简单应用举例

(1) 判断int型变量a是奇数还是偶数

a&1 = 0 偶数

a&1 = 1 奇数

(2) 取int型变量a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1

(3) 将int型变量a的第k位清0,即a=a&~(1<

<>

(4) 将int型变量a的第k位置1, 即a=a|(1<

<>

(5) int型变量循环左移k次,即a=a<>16-k (设sizeof(int)=16)

(6) int型变量a循环右移k次,即a=a>>k|a<<16-k (设sizeof(int)=16)

(7)整数的平均值

对于两个整数x,y,如果用 (x+y)/2 求平均值,会产生溢出,因为 x+y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:

int average(int x, int y) //返回X,Y 的平均值

{

return (x&y)+((x^y)>>1);

}

(8)判断一个整数是不是2的幂,对于一个数 x >= 0,判断他是不是2的幂

boolean power2(int x)

{

return ((x&(x-1))==0)&&(x!=0);

}

(9)不用temp交换两个整数

void swap(int x , int y)

{

x ^= y;

y ^= x;

x ^= y;

}

(10)计算绝对值

int abs( int x )

{

int y ;

y = x >> 31 ;

return (x^y)-y ; //or: (x+y)^y

}

(11)取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n – 1)

(12)乘法运算转化成位运算 (在不产生溢出的情况下)

a * (2^n) 等价于 a<< n

(13)除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n

例: 12/8 == 12>>3

(14) a % 2 等价于 a & 1

(15) if (x == a) x= b;

else x= a;

等价于 x= a ^ b ^ x;

(16) x 的 相反数 表示为 (~x+1)

在32位系统上不要右移超过32位,不要在结果可能超过 32 位的情况下左移

相关推荐:

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

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

相关文章

盘点6款实用的文件对比工具,你都用过吗?

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

aggregations 详解1(概述)

aggregation分类 aggregations —— 聚合&#xff0c;提供了一种基于查询条件来对数据进行分桶、计算的方法。有点类似于 SQL 中的 group by 再加一些函数方法的操作。 聚合可以嵌套&#xff0c;由此可以组成复杂的操作&#xff08;Bucketing聚合可以包含sub-aggregation&#…

IDEA开发中,类的头位置生成作者时间信息

点击 File > Settings > File and Code Templates > Class按照图中步骤添加如下信息 #if (${PACKAGE_NAME} && ${PACKAGE_NAME} ! "")package ${PACKAGE_NAME};#end #parse("File Header.java") /** * Author WangZeyu * Date ${…

提现接口网站 php,API提现接口

>获取提现积分的类型&#xff0c;在后台可以设置某种积分可被提现&#xff0c;此处获取的数据为可提现积分的类型~~~[api]get:/index.php/accounts/Apipoint/member_withdrawal_listint:type 0#是否智能限制提现积分类型&#xff0c;0&#xff1a;不智能&#xff0c;1&#…

数据库:PostgreSQL 和 MySQL对比

比较版本&#xff1a;PostgreSQL 11 VS MySQL5.7&#xff08;innodb引擎&#xff09; Oracle官方社区版版权情况&#xff1a;PostgreSQL 11&#xff08;免费开源&#xff09;、MySQL5.7 Oracle官方社区版&#xff08;免费开源&#xff09; 1. CPU限制 PGSQL没有CPU核心数限制&a…

C#获取当前系统磁盘符、系统目录、桌面等

1.获取方式如下 Environment.SpecialFolder中定义了许多常用的目录 //获取当前系统磁盘符方法1&#xff0c;返回&#xff1a;C: string path Environment.GetEnvironmentVariable("systemdrive"); //获取当前系统磁盘符方法2,返回&#xff1a;C: string path Envir…

MAC电脑常用效率工具推荐

❤️作者主页&#xff1a;IT技术分享社区 ❤️作者简介&#xff1a;大家好,我是IT技术分享社区的博主&#xff0c;从事C#、Java开发九年&#xff0c;对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉&#xff1a; 数据库领域优质创作者&#x1f3c6;&#x…

Java String类型转换成Date日期类型

//格式化数据 SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String format sdf.format(new Date()); System.out.println(format);//String格式的数据转化成Date格式 String timeStr "2019-07-09 03:34:56 "; Date parse sdf.pa…

docker php 安装swoole,swoole(1)使用docker安装swoole环境

1.下载镜像pull php 镜像docker pull php:7.3-alpine3.8创建容器docker run -it --name test php:7.3-alpine3.8 sh2.进入容器安装swoole# 安装依赖的第三方包echo http://mirrors.ustc.edu.cn/alpine/v3.7/main > /etc/apk/repositories && \echo http://mirrors.u…

插件书写示例

正常模态框代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"widthdevice-wid…

MAC电脑8款常用设计工具推荐

目录 1、Sketch 3 2、Affinity Designer 3、Framer 4、PaintCode 5、Hype 3 Professional 6、Pixave 2 7、Iconjar 8、Sip for Mac and iPhone 1、Sketch 3 Sketch是完全满足我上面4条选择条件的一款UI设计工具&#xff0c;前文第50页已经提到过相关内容。 2、Affinity Designe…

matlab the installer cannot read,MATLAB安装 The installer cannot read the mwinstall.dll… | 学步园...

前提&#xff1a;安装前的文件 的 目录 不需含有 中文安装MATLAB7时弹出以下警告对话框&#xff0c;显示“ The installer cannot read the mwinstall.dll file, This is probably due to a CD reader which can only read files with an eight.three naming convention. Pleas…

专家观点:即使在云中 硬件同样至关重要

英特尔最近发布了新一代企业级CPU。第四代E5和E7CPU确实有些与众不同之处&#xff1a;更多的缓存、更多的内核、更快更多的RAM。但是大家没有发现这款产品还有一个特别的地方。 也许一切都与云有关&#xff0c;我们已经告别以前的硬件。你可能认为IT命令结构级别越高&#xff0…

matlab怎么安装compiler,关于MATLAB中compiler配置问题

按照大家的方法进行了系统配置&#xff0c;下载安装了SDK7.1&#xff0c;可运行mex setup之后还是一直弹出No supported SDK or compiler was found on this computer.Welcome to mex -setup. This utility will help you set upa default compiler. For a list of supported…

计算机硬件:内存条的基础知识笔记

在电脑硬件中&#xff0c;CPU、显卡、内存均三者是重中之重&#xff0c;所以我们在选择这些核心硬件一定要慎重。今天给大家分享一下关于的电脑内存基础知识&#xff0c;让更多的装机朋友们可以更好的学习内存相关知识。 史上最易懂的电脑内存基础知识 内存条的基本概念&#x…

数独Sudoku

数独&#xff08;すうどく&#xff0c;Sūdoku&#xff09;&#xff0c;是源自18世纪瑞士发明&#xff0c;流传到美国&#xff0c;再由日本发扬光大的一种数学游戏。是一种运用纸、笔进行演算的逻辑游戏。玩家需要根据99盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&…

电脑CPU选购的几个指标

CPU的概念介绍 CPU是Central Processing Unit(中央处理器)的缩写&#xff0c;CPU的详细参数包括内核结构&#xff0c; 主频&#xff0c;外频&#xff0c;倍频&#xff0c;接口&#xff0c;缓存&#xff0c;多媒体指令集&#xff0c;制造工艺&#xff0c;电压&#xff0c;封装形…

idea生成方法注释的正确方法

生成方法注释 1.打开File -> Settings 2.Editor -> Live Templates -> 点击右边加号为自己添加一个Templates Group -> 然后选中自己的Group再次点击加号添加Live Templates 重点&#xff1a;Abbreviation那里不要用/开头的&#xff01;&#xff01;&#xff01; …

php linux 缓存文件,Linux下搭建网站提示缓存文件写入失败怎么办?

Linux下搭建网站提示缓存文件写入失败时该怎么处理&#xff1f;基于ThinkPHP框架及Linux环境搭建的网站&#xff0c;经常会遭遇缓存文件写入失败的错误提示&#xff0c;即便是现在流行的P2P网站程序便是如此&#xff0c;具体解决方法请看下文。Linux下搭建网站提示缓存文件写入…

什么是CharSequence

CharSequence是一个接口&#xff0c;比较常见的String、StringBuilder、StringBuffer都实现了这个接口。 当我们看到一个API里面有CharSequence的时候&#xff0c;它也是可以被其子类代替的&#xff0c;一般用String代替即可。