位运算符
位运算符允许对整型数中指定的位进行求值和操作。
例子 | 名称 | 结果 |
---|---|---|
$a & $b | And(按位与) | 将把 $a 和 $b 中都为 1 的位设为 1。 |
$a | $b | Or(按位或) | 将把 $a 和 $b 中任何一个为 1 的位设为 1。 |
$a ^ $b | Xor(按位异或) | 将把 $a 和 $b 中一个为 1 另一个为 0 的位设为 1。 |
~ $a | Not(按位取反) | 将 $a 中为 0 的位设为 1,反之亦然。 |
$a << $b | Shift left(左移) | 将 $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。 |
$a >> $b | Shift right(右移) | 将 $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。 |
位移在 PHP 中是数学运算。向任何方向移出去的位都被丢弃。左移时右侧以零填充,符号位被移走意味着正负号不被保留。右移时左侧以符号位填充,意味着正负号被保留。
运算符有的人会说了,用在php中有什么好处,为什么这里要用位运算
那么当我们设定了权限之后,假如要判断某个权限是不是包含另一个权限,这个时候,位运算有很有用,接下来我们看个例子:
首先,设定好权限的值
/** * This file defines common constants used in ownCloud */ namespace OCP; /** * CRUDS permissions. */ const PERMISSION_CREATE = 4; const PERMISSION_READ = 1; const PERMISSION_UPDATE = 2; const PERMISSION_DELETE = 8; const PERMISSION_SHARE = 16; const PERMISSION_GROUP=32; const PERMISSION_TEAM=64; const PERMISSION_ALL = 127;
假如$currentPermission = 7;//转换为二进制即: 0000 0000 0000 0111
而\OCP\PERMISSION_CREATE = 4;//转换为二进制即:0000 0000 0000 0100
\OCP\
假如我们要实现判断当有创建的权限的时候,给它将创建的权限去掉,就可以这样写:
if($currentPermission & \OCP\PERMISSION_CREATE){ $currentPermission = $currentPermission ^ \OCP\PERMISSION_CREATE; }
7&4 = 0000 0000 0000 0100//等于4
7^4 = 0000 0000 0000 0011//等于3
这样就剔除了创建的权限 ,同样当$currentPermission不包括某个权限的时候给他加上某个权限
if(!($currentPermission & \OCP\PERMISSION_DELETE)){ $currentPermission = $currentPermission | \OCP\PERMISSION_DELETE; }
7转换为二进制为:0000 0000 0000 0111
8转换为二进制为:0000 0000 0000 1000
7 & 8 = 0000 0000 0000 0000//值为0即false
7 | 8 = 0000 0000 0000 1111//值为15
此时$currentPermission = 7 | 8 = 15
这样就实现了权限的相加
总结:其实在我看来位运算主要就是起到了一个对权限是否存在的判断,这一点用在这里再好不过。当然权限的定义也是有一定规范的,都是2的指数倍。
转载自:https://blog.csdn.net/m0_37865231/article/details/75516193